solved_ac[Class2][나이순 정렬](https://www.acmicpc.net/problem/10814)
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.
첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)
둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.
첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.
3
21 Junkyu
21 Dohyun
20 Sunyoung
20 Sunyoung
21 Junkyu
21 Dohyun
튜플, sort 를 이용하여 2가지 value 중 한가지만 sort를 하면 된다.
나이와 이름을 입력 받는다
나이가 낮은 순서대로 정렬을 하되, 나이가 같다면 먼저 들어온 사람을 더 앞에 정렬해준다.
처음에 sort를 생각하지 않고 deque를 이용하여 풀었다.
deque에 2차원으로 넣어주고 2중 반복을 이용하여 입력을 받을때 마다 그 전의 나이들을 비교하여 appendleft와 pop을 해주면서 넣었다 뺏다를 반복해주었다.
import sys
from collections import deque
N = int(sys.stdin.readline())
deq = deque()
for i in range(N):
deq.append(list(sys.stdin.readline().split()))
for j in range(0, i):
if int(deq[i][0]) < int(deq[j][0]):
deq.appendleft(deq[i])
deq.pop()
break
for j in range(N):
print(deq[j][0], deq[j][1])
시간초과가 뜬다. 2중 for문인것도 그렇고, appendleft와 pop이 가져오는 연산량이 생각보다 많은 모양이다.
age와 name을 따로 받고 age만을 따로 int형으로 바꿔준 후 status 배열에 튜플 형태의 (age, name) 으로 집어넣어준다.
주의
sort 함수를 쓰는데 첫번째 인덱스를 기준으로만 sort를 하여서 문제의 취지와 딱 맞는다.
import sys
N = int(sys.stdin.readline())
status = []
for i in range(N):
age, name = sys.stdin.readline().split()
age = int(age)
status.append((age, name))
status.sort(key = lambda x : x[0])
for j in range(N):
print(status[j][0], status[j][1])
주의
만약 age를 int형으로 바꾸지 않고 푼다면 숫자 크기로 정렬을 하는 것이 아닌 문자열 순서로 정렬이 된다. 이게 무슨 말이냐?
3 2 21 이라는 배열이 있다.
이런식으로 정렬이 된다. 숫자를 문자로 보기 때문에 이런 결과가 나온다.
숫자를 기준으로 정렬을 하려면 무조건 int형으로 바꿔주고 정렬을 하자!