문제 : https://www.acmicpc.net/problem/2204
꿍은 도비에게 영어단어들을 제시한 후 어떤 단어가 대소문자를 구분하지 않고 사전순으로 가장 앞서는지 맞추면 양말을 주어 자유를 얻게해준다고 하였다.
하지만 인성이 좋지 않은 꿍은 사실 그러고 싶지 않았기 때문에 대소문자를 마구 섞어가며 단어들을 제시했다. 예를 들어, apPle은 Bat보다 앞서지만 AnT보다는 뒤에 있는 단어다.
도비에게 희망은 여러분뿐이다! 여러분이 도비에게 자유를 선물해주도록 하자!
입력
각 테스트케이스는 정수 n (2 ≤ n ≤ 1000) 으로 시작하며 주어지는 단어의 개수를 뜻한다.
다음 각 n줄은 길이가 최대 20인 단어가 주어지며 대소문자의 구분을 없앴을 때 똑같은 단어는 주어지지 않는다.
마지막 입력은 0이 주어진다.
출력
각 줄에 각 테스트케이스에서 사전상 가장 앞서는 단어를 출력한다.
📌 문제 탐색하기
sort() 이용하여 대소문자 구분 없이 작은 단어부터 배열에 할당하고, 배열의 [0]값 출력
📌 코드 설계하기
1. 입력값 받아오기
- 첫 째줄 N : int(input())
2. N이 0이 나올 때까지 while문 반복
- 배열 값: for i in range(N): arr.append(int(sys.stdin.readline()))
2. 배열 정렬
- arr.sort()
3. 가장 작은 값 출력
- arr[0]
📌 시도 회차 수정 사항
[1회차]
- 출력 형식이 잘못되었다는 에러가 발생했다.
- 해결방법을 알아보고자 찾아보니 코드의 2가지 문제를 알게되었다.
1. 개행 문자 삭제
- 문자열의 값을 그대로 가져오면, 문자열의 앞뒤에서 공백(스페이스) 및 개행 문자(\n, \r, \t 등)가 제거되지 않는다.
- 이를 제거하기 위해서는 input().strip()을 붙여야만 한다.
2. 소문자/대문자 비교
- 파이썬에서 sort()를 사용하면 소문자와 대문자 상관없이 자동으로 정렬이 잘 되는 줄 알았다.
- 그러나 알고보니 대문자 먼저 정렬 후, 나머지 소문자를 정렬하는 것 같다.
- 모두 소문자로 변환하여 비교 및 정렬하기 위해서는 str.lower()를 사용해야 한다.
//실패 코드
import sys
input=sys.stdin.readline
while True:
n=int(input())
if n==0:
break
arr=[]
for _ in range(n):
arr.append(input())
arr.sort()
print(arr[0])
📌 정답 코드
import sys
input=sys.stdin.readline
while True:
n=int(input())
if n==0:
break
arr=[]
for _ in range(n):
arr.append(input().strip())
arr.sort(key=str.lower())
print(arr[0])
해설 : https://whydevsaysno.notion.site/f2f6d64c352e402f87d6efb49b4c31ad
'코딩테스트' 카테고리의 다른 글
[Python] 백준 2193 : 이친수 (0) | 2025.01.25 |
---|---|
[Python] 백준 2303 : 숫자 게임 (0) | 2025.01.25 |
[Python] 백준 2644 : 촌수계산 (0) | 2025.01.21 |
[Python] 백준 11724 : 연결 요소의 개수 (1) | 2025.01.20 |
[Python] 백준 17204 : 죽음의 게임 (1) | 2025.01.19 |