문제
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.
입력
첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)
둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.
출력
첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.
예제입력
3
21 Junkyu
21 Dohyun
20 Sunyoung
예제출력
20 Sunyoung
21 Junkyu
21 Dohyun
이 문제는 사실 정렬의 기준이 여러개 있을 때 해당 기준에 맞게끔 정렬을 할 수 있는가를 물어보는 간단한 문제였습니다
Python 같은 경우에는 정렬의 기준 key를 여러개를 넣은 튜플로 설정하면 아주 쉽게 구할 수 있습니다
다만, 이 문제에서 주어진 조건 중에 나이가 같을 경우 입력이 먼저 된 순서대로 출력되도록 하라고 요구하고 있습니다
입력받은 데이터를 차례대로 리스트에 집어넣었다면 그 리스트의 인덱스는 들어온 순서를 나타내게 됩니다 인덱스 값들도 별도로 보유하고 있어서 그 값을 기준으로 정렬하게 된다면 나이 순, 리스트에 먼저 입력된 순서로 정렬하여 문제를 해결할 수 있습니다
리스트를 인덱스 값과 해당 인덱스 안에 들어있는 값을 튜플로 같이 묶어준 데이터를 맵핑 해주는 것이 enumerate라는 함수입니다
이것을 사용하면 마치 딕셔너리 타입에서 .items()를 사용하면 키와 키에 대응하는 값이 같이 나오던 것 같은 결과를 받을 수 있습니다.
다만! enumerate함수는 맵핑된 주소를 리턴해주기 때문에 list로 감싸주어야 활용할 수 있습니다
풀이는 다음과 같습니다
N = int(input())
userList = []
for _ in range(N):
tmpArr = input().split()
tmpArr[0] = int(tmpArr[0])
userList.append(tmpArr)
userList = list(enumerate(userList))
# print(userList)
ans = sorted(userList, key = lambda X : (X[1][0], X[0]))
for i in ans:
print(i[1][0],i[1][1])
lambda 함수는 한 줄 짜리로 끝나는 간단한 함수를 축약시켰다고 생각하면 됩니다
lambda 함수를 쓰지 않았다면
fn f1(X):
return (X[0],X[1])
이런식으로 별도의 함수를 지정해서 넣어주어야 했으며 코드도 sorted(userList, key = f1)이런 식으로 적어줘야했을 것 입니다
userList.sort()는 해당 리스트 내부를 다 정렬시켜버리게 되어 버립니다 기존 값의 위치를 보존할 수 없습니다
반면, sorted()는 인자에 집어넣은 정렬을 하고자 하는 데이터에 대해서 기준에 맞춰서 정렬을 실시한 후에 해당 객체를 리턴해줍니다
userList 내부를 바꿔버리는 것이 아니라 새로운 변수에 할당 할 수 있게 리턴해줍니다
리턴된 정렬리스트를 변수 ans에서 받았고 출력할 때에는 i[0] 부분에 아직 인덱스가 있지만 분리하거나 지워버리는 처리작업이 문제를 푸는데 불필요한 작업이기에 그대로 두고서 정답만 출력하도록 해당 관련 인덱스만 뽑아서 출력하였습니다
'알고리즘 > 문제풀이' 카테고리의 다른 글
백준 2164번 카드2 - Python (0) | 2023.02.24 |
---|---|
백준 10816번 숫자카드 2 - Python (0) | 2023.02.23 |
백준 11050번 이항계수1 - Python (0) | 2023.02.22 |
백준 10845번 큐 - Python (0) | 2023.02.22 |
백준 10250번 ACM 호텔 - Python (0) | 2023.02.21 |