Baekjoon 문제 풀기 (10814번 : 나이순 정렬) Python

10814번 : 나이순 정렬

1. 문제읽기


정렬 문제

처음에 문제의 조건인 나이가 같다면 “가입한 순서”로 정렬된다는 것을 간과하고 문제를 풀었다가 틀렸다.
다시 자세히 보니 나이가 같다면 입력 받은 순서대로 출력하라는 의미였다.
이 조건이 핵심인 문제였다.

2. 제출 코드


일단 처음 보자마자 정렬 문제일 것이라고 예상했고, 100,000의 입력값을 받으니 nlogn 까지의 정렬을 이용해야겠다는 생각을 했다.
그러면 내장 정렬 sort를 이용해도 되겠다고 생각했고, sort를 썼는데 문제의 조건인 입력 순서대로 정렬이 되지 않았다. sort는 알파벳 순서도 같이 정렬해버리기 때문이다.

버블정렬을 쓰면 시간초과가 날 것이 분명하므로, set을 이용하여 나이 중복을 제거해서 리스트를 만들어줬다.
그리고 이중for문을 이용해서 가장 어린 나이부터 찾아서 새로 리스트에 요소를 추가해주면서 새로운 정렬 리스트를 만들었다.
채점이 굉장히 오래걸리길래 아.. 시간초과 각인가라고 생각했지만 예상외로 맞았다!

n = int(input())
arr = []

for _ in range(n):
    arr.append(input().split())
for i in range(n):
    arr[i][0] = int(arr[i][0])

age_arr = []
for i in arr:
    age_arr.append(i[0])

n_age_arr = list(set(age_arr))
ans = []
for j in n_age_arr:
    for i in arr:
        if j == i[0]:
            ans.append(i)


for i in ans:
    print(*i)

3. 공부할 것


예전에 sort의 정렬 조건 key에 대해서 배웠던 기억이 나긴 했는데, 어떻게 쓰는지 까먹었다.
key와 lambda를 써서 간단하게 풀 수 있다.
lambda는 익명함수인데, 뭔가 쓰기 어려워서 꺼리게된다..

우선 for문을 한개 더 돌려서 나이를 int로 바꿔주는 코드를 아래와 같이 조금 더 간단하게 바꿔보았다.
그리고 sort에 key= 를 쓰면 정렬 조건을 사용할 수 있는데, 여기에 lambda식으로 정렬 조건을 만들어 줄 수 있다.
arr 리스트의 각 요소는 [나이, 이름]의 리스트이므로 리스트를 l로 잡고 l의 0번 요소, 즉, 나이를 기준으로 정렬시킨다.

n = int(input())
arr = []

for _ in range(n):
    age, name = input().split()
    arr.append([int(age), name])

arr.sort(key=lambda l: l[0])

for i in arr:
    print(i[0], i[1])

댓글남기기