수요일... 그 전날 과음으로 장렬히 전사하고 몇 시간을 침대에서 골골거렸다... 기쁠 때, 슬플 때 먹는 술은 항상 조심하기... 그래서 오늘은! 정신차리고 할 일을 헤쳐나가보기로 ~!~! 했다!
문제는 나이순 정렬 -> 나이가 같을 때는 가입순 정렬을 푸는 문제였다. 생각보다 간단하였기에, 금방 풀 줄 알았으나...
세 번째 도전 끝에 맞췄다...^^! 일단 이유를 추측하기론, 정렬을 할 때 숫자를 문자로 바꾸지 않아도 정렬이 잘 되기에(그도 그럴 것이 숫자도 아스키 코드나 다른 코드로 나타냈을 때 순서에 맞게 차례대로 증가하니까...) 마지막까지 문자를 숫자로 형변환해주지 않았다. 하지만...! 이 부분에서 큰 miss가 있는 듯하여 두 번 정도 고쳤다.
import sys
N = int(sys.stdin.readline())
member = []
for i in range(N):
member.append(list(map(str, sys.stdin.readline().strip().split()))+[i])
member.sort(key = lambda x: (int(x[0]), x[2]))
for i in range(N):
print(member[i][0], member[i][1])
그래도 코드가 점점 간결해지는 것 같아 뿌듯해하는 중이다. 여기서 기억했어야 하는 점은,
이 문제가 가입한 순서로 정렬을 해야하는 부분도 있다보니, 뭔가 enumerate를 써도 되지 않을까 ?! 생각했다. 그런데 enumerate를 쓸 바에는 그냥 for 문의 인덱스로 접근하는 게 더 빠를 거라고 생각했다. 더불어 도저히 enumerate를 써서 코드를 작성하는 로직이 떠오르지 않아... 인터넷을 찾아보았다.
그런데 생각해보니... 그렇게 어렵게 접근할 필요가 없었다.
어짜피 sort에서 key에 따른 정렬을 끝내면 나머지는 기존의 정렬과 똑같다.
이 말인 즉슨, input이 가입한 순서로 들어왔으니 나는 나이순으로만 정렬을 하면 되는 부분...! 정말 또 새로운 깨달음을 얻고 간다...
import sys
N = int(sys.stdin.readline())
member = []
for _ in range(N):
member.append(sys.stdin.readline().strip().split())
member.sort(key = lambda x: int(x[0]))
for i in range(N):
print(member[i][0], member[i][1])
그리고 어짜피 split 되면 리스트가 되니까 str, map, list를 쓸 필요도 없었다...! 아직 나는 갈 길이 멀다...
확실히 새로이 리스트를 할당할 일도, 변수 i를 추가해줄 필요도 없어서 시간적인 측면이나 공간적인 측면에서 조금은 더 효율이 좋은 듯하다.
오늘도 신기한 알고리즘의 세계 끝!