문제가 너무 쉬워보여서 그냥 5분컷 할 수 있는 문제인 줄 알았는데..
그냥 나의 바보력을 한 번 더 인증할 수 있었던 문제였다.
파이썬 숏코딩 좀 더 연습하고 함수들도 더 공부해야 할 듯하다..
<첫 번째 시도>
import sys
N = int(input())
input = sys.stdin.read
word = input().splitlines()
word.sort(key = len) # 길이 순 정렬
word.sort() # 사전순 정렬
for i in word:
print(i)
위와 같이 sys.stdin.read로 입력받은 리스트에 대해서 key=len 옵션으로 정렬하고, 다음에 sort()로 한 번 더 정렬하면 위와 같은 (틀린)결과가 나온다.
이는 문자열을 먼저 길이 순으로 정렬한 뒤에, 사전 순으로 정렬하면 각각 개별로 정렬하는 것이기 때문에 당연하게도 먼저 길이순으로 정렬해놓은 것은 영향이 없어지게 되기 때문이다.
이를 해결하기 위해서는 key 값에 **lambda**를 적용해야 함
lst.sort(key=lambda x: (1순위 조건, 2순위 조건, …))
word.sort(key=lambda x :(len(x), x))
→ len(x)를 통해 길이 순서로 정렬하되, 두 번째 조건인 x를 통해서 사전순으로 정렬할 수 있음
이는 key에는 한 개의 정렬 기준만 적용이 가능하기 때문에 lambda를 사용해서 두 개의 정렬 기준을 하나의 정렬 기준인 것처럼 사용할 수 있다!
<두 번째 시도>
import sys
N = int(input())
input = sys.stdin.read
word = input().splitlines()
word.sort(key = lambda x:(len(x), x)) # 길이 및 사전순 정렬
for i in range(0, N):
if i>1 and (word[i]==word[i-1]):
continue
print(word[i])
람다를 사용하여 수정하니까 이제 예제 테스트가 제대로 출력이 되는 것을 확인할 수 있다.
그런데 해당 코드를 제출했는데도 이상하게 계속 틀렸다고 나왔음…
다양한 방면으로 수정해보다가 다음과 같이 성공했다!
<최종 정답 코드>
N = int(input())
word = [input().strip() for _ in range(N)] # 단어 입력
# 중복 제거 한 뒤 길이 및 사전순 정렬
word = sorted(set(word), key = lambda x:(len(x), x))
for w in word:
print(w)
- 우선 전에 사용하던 sys.stdin.read 에서는 입력을 한 번에 읽어들인 후 모든 줄을 문자열로 반환했었는데, 이를 없애고 그냥 input()으로 바꿔서 각 단어를 줄바꿈 없이 입력받도록 하였다.
- 또한 전에는 중복 단어를 포함한 채로 먼저 람다로 길이와 사전순 정렬을 한 뒤, 마지막 for문에서 중복일 경우 continue로 다음 단계로 넘어가도록 유도했었음
- 그러나 이는 i > 1 조건을 설정해놨기 때문에 인덱스 0인 경우에는 중복을 걸러내는 로직이 제대로 동작하지 않을 수도 있겠다는 생각이 들었다.
- 따라서 이를 아예 지워버리고 애초에 sorted함수와 set()을 사용하여 집합으로 변환하며 중복을 먼저 제거하고 난 뒤 → 람다 key로 길이와 사전 순 정렬을 진행하는 방식으로 숏코딩 수정
- 이렇게 하면 for문에서 조건문을 사용하지 않고 위 코드처럼 순서대로 출력만 해주면 된다!
'Python' 카테고리의 다른 글
[백준/Python] 2751 : 수 정렬하기 2 (0) | 2024.09.15 |
---|---|
[백준/Python] 2108 : 통계학 (0) | 2024.09.15 |
[백준/Python] 26215 : 눈 치우기 (0) | 2024.09.08 |
[백준/Python] 1213 : 펠린드롬 만들기 (0) | 2024.09.08 |
[백준/Python] 11478 : 서로 다른 부분 문자열의 개수 (0) | 2024.09.07 |