조금씩 꾸준히 완성을 향해

[Algorithm] 백준 10814 나이순 정렬 with Python 본문

DataStructure & Algorithm/문제풀이

[Algorithm] 백준 10814 나이순 정렬 with Python

all_sound 2022. 10. 6. 16:05

문제

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

입력

첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)

둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.

출력

첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.

예제 입력 

3
21 Junkyu
21 Dohyun
20 Sunyoung

예제 출력 

20 Sunyoung
21 Junkyu
21 Dohyun

내가 짠 코드

n = int(input())
names = []  
li = []
for i in range(n):
    age, name = input().split() #age, name 입력받기
    names.append(name)  #name 먼저 따로 저장
    t = (int(age), i)  #나이와 인덱스번호(가입순서)를 튜플로 저장
    li.append(t)  #튜플을 리스트에 저장(정렬을 위해)
li.sort() #튜플이 저장된 리스트를 오름차순 정렬
for x in li:
    print(x[0], names[x[1]]) 
    #정렬된 리스트에서 나이 선택, names 리스트에서 인덱스에 해당하는 이름 선택

바로 전에 풀었던 정렬 문제 세 개보다 조금 더 업그레이드 된 문제같다. 

입력값만을 잘 정렬하면 되는 게 아니라 입력값의 순서까지 고려해야 되기 때문이다. 

처음에는 order라는 변수를 따로 만들어서 for문 안에서 name이 append 될 때마다 +1을 해주는 식으로 순서를 구현했다. 

그런데 생각해 보니 for 문 자체가 순서대로 도는 거라 for 문의 범위를 인덱스로 바로 써도 되는 것이었다!

 

그렇게 나이와 가입순서를 튜플로 묶어 리스트에 담아 정렬을 하고, 

출력값으로는 나이와 함께 가입순서에 해당하는 이름을 선택해서 출력했다. 


출력에서 한 가지 주의해야 할 점이 있는데, 숫자값은 모두 int or float 으로 숫자화해줘야 한다는 것이다.

그냥 문자열로 받아서 그대로 출력하니 정답 인정이 되지 않았다. 

 

 

 

 

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

 

10814번: 나이순 정렬

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

www.acmicpc.net