https://www.acmicpc.net/problem/10814
야심차게 풀었다가 틀렸다.
처음 제출한 코드는 아래와 같다.
import sys
N = int(sys.stdin.readline())
users = []
for i in range(N):
# 나이, 이름 저장
temp = list(sys.stdin.readline().rstrip().split(' '))
# 가입 순서 저장
temp[0] = int(temp[0])
temp.append(i)
users.append(temp)
# print(users)
# 나이, 가입 순서로 정렬
users.sort(key=lambda x: (x[0], x[2]))
for user in users:
print(user[0], user[1])
디버깅 과정에서..
영어 소문자(a=97~), 대문자(A=65~)의 아스키 코드 값 크기가 반대이니까, 소문자로 사용자 이름을 저장한 뒤 이 값을 기준으로 users를 정렬하고자 했다.
그런데..
문제에서 나이, 가입 순서로만 정렬을 하기 때문에 위의 생각은 의미가 없었다.
오답의 원인은,
'문자열 정렬'과 '정수 정렬'의 차이점에 있었다.
(즉, 사용자의 나이를 정수가 아닌 문자열 타입으로 받은 게 오답의 원인이다.)
아래의 코드를 보자.
test_1 = ['1', '11', '33', '2', '3', '5']
test_1.sort()
print(test_1)
test_2 = [1, 11, 33, 2, 3, 5]
test_2.sort()
print(test_2)
print(test_1)의 출력 결과가 ['1', '2', '3', '5', '11', '33']일 것이라 생각했는데.. 실제 출력 결과는 아래와 같다.
['1', '11', '2', '3', '33', '5'] // test_1: 문자열 정렬
[1, 2, 3, 5, 11, 33] // test_2: 정수 정렬
핵심은,
'문자열로 이루어진 리스트'의 경우 '사전식 순서'로 정렬된다는 것이다.
즉, test_1을 사전식 순서로 정렬하면 '1'로 시작하는 원소들이 '2'로 시작하는 원소들보다 앞에 위치하게 된다.
수정된 최종 코드(정답)는 아래와 같다.
import sys
N = int(sys.stdin.readline())
users = []
for i in range(N):
# 나이, 이름 저장
temp = list(sys.stdin.readline().rstrip().split(' '))
# 가입 순서 저장
temp[0] = int(temp[0])
temp.append(i)
users.append(temp)
# print(users)
# 나이, 가입 순서로 정렬
users.sort(key=lambda x: (x[0], x[2]))
for user in users:
print(user[0], user[1])