[BOJ] 10814: 나이순 정렬

이슬비·2022년 3월 17일
0

Algorithm

목록 보기
13/110
post-thumbnail

수요일... 그 전날 과음으로 장렬히 전사하고 몇 시간을 침대에서 골골거렸다... 기쁠 때, 슬플 때 먹는 술은 항상 조심하기... 그래서 오늘은! 정신차리고 할 일을 헤쳐나가보기로 ~!~! 했다!

10814: 나이순 정렬

1. 내 풀이: 성공

문제는 나이순 정렬 -> 나이가 같을 때는 가입순 정렬을 푸는 문제였다. 생각보다 간단하였기에, 금방 풀 줄 알았으나...

세 번째 도전 끝에 맞췄다...^^! 일단 이유를 추측하기론, 정렬을 할 때 숫자를 문자로 바꾸지 않아도 정렬이 잘 되기에(그도 그럴 것이 숫자도 아스키 코드나 다른 코드로 나타냈을 때 순서에 맞게 차례대로 증가하니까...) 마지막까지 문자를 숫자로 형변환해주지 않았다. 하지만...! 이 부분에서 큰 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])

그래도 코드가 점점 간결해지는 것 같아 뿌듯해하는 중이다. 여기서 기억했어야 하는 점은,

  1. split()을 해주면 리스트가 되기 때문에, strip과 split을 같이 쓰고 싶다면 strip -> split의 순으로 하자!
  2. 숫자를 그대로 두지말고 할 수 있을 때 재깍재깍 형변환을 해두자!

이 문제가 가입한 순서로 정렬을 해야하는 부분도 있다보니, 뭔가 enumerate를 써도 되지 않을까 ?! 생각했다. 그런데 enumerate를 쓸 바에는 그냥 for 문의 인덱스로 접근하는 게 더 빠를 거라고 생각했다. 더불어 도저히 enumerate를 써서 코드를 작성하는 로직이 떠오르지 않아... 인터넷을 찾아보았다.

2. 다른 풀이

그런데 생각해보니... 그렇게 어렵게 접근할 필요가 없었다.
어짜피 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를 추가해줄 필요도 없어서 시간적인 측면이나 공간적인 측면에서 조금은 더 효율이 좋은 듯하다.

오늘도 신기한 알고리즘의 세계 끝!

profile
정말 알아?

0개의 댓글