본문 바로가기
코딩테스트/문제 풀이

[파이썬] 백준 10814번 나이순 정렬

by 왕자두 2024. 3. 23.

https://www.acmicpc.net/problem/10814

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

www.acmicpc.net

[문제 이해]

나이와 이름이 주어졌을 때 나이순으로 정렬하고, 만약 나이가 동일하다면 입력 받은 순서대로 회원을 정렬하는 문제였다.

 

[문제 풀이]

문제의 난이도는 높지 않아서 해결 방법은 쉽게 찾긴 했지만 헷갈리는 부분이 몇 개 있었다.

1. 입력을 어떻게 받아야 하지?

2. 정렬 기준을 어떻게 하지?

3. 출력은 어떻게 하지?

사실 문제를 풀면서 당연히 고민해보게 될 부분인데 이번에는 특히나 문제가 쉬운 만큼 고민이 되었던 것 같다.

먼저 1번 입력을 어떻게 받아야 하는가에 대한 풀이는 아래 [참고] 를 참고하면 되는데, 배열 원소에 또 다른 배열을 넣어 이중배열(?)을 사용하여 입력을 받았다. 2번에 대한 고민은 나이가 같은 경우 어떻게 처리해야하는가를 고민하면서 나온 의문이었는데 생각해보니 입력 받은 순서를 유지하면 먼저 가입한 사람이 먼저 올 수 밖에 없기 때문에 정렬 기준은 나이순 하나로만 하면 되겠다고 확신이 들었다. 3번에 대한 풀이는 아래 정답 코드에서도 확인할 수 있듯이 회원 리스트에 해당하는 원소를 가져와서 중간에 한 칸 비우고 출력할 수 있도록 구현하였다.

import sys

N = int(sys.stdin.readline())

mem_list = list()
for i in range(N):
    mem_list.append(sys.stdin.readline().split())

mem_list = sorted(mem_list, key = lambda x : int(x[0]))

for i in mem_list:
    print(i[0] + ' ' + i[1])

 

[참고]

배열을 입력받는 방식이 헷갈려서 아래에 따로 정리해봤다.

 

strip()을 사용하는 경우

for i in range(N):
    mem_list.append(sys.stdin.readline().strip())
    
# 출력 결과
['21 Junkyu', '21 Dohyun', '20 Sunyoung']

 

split()을 사용하는 경우

for i in range(N):
    mem_list.append(sys.stdin.readline().split())
    
# 출력 결과
[['21', 'Junkyu'], ['21', 'Dohyun'], ['20', 'Sunyoung']]