https://www.acmicpc.net/problem/1181
문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
풀이
테스트 케이스 입력 후 이중정렬을 요구하는 문제다. 단순히 정렬을 위해 list 선언 후 append 함수를 통해 추가시킨 다음 정렬하는게 다가 아니다.
코드를 짜면서 총 3번의 오류가 있었는데, 그 코드들과 이유는 다음과 같다.
#첫번재 시도(오류)
t=int(input()) #테스트 케이스 수 입력
listn=[] #문자열을 저장할 리스트 선언
for i in range(t): #테스트 케이스만큼 반복
n=input() #추가할 문자열 입력
listn.append(n) #입력한 문자열 리스트에 추가
listn.sort(key=len) #길이순으로 리스트 안에 있는 객체들을 정렬
for j in range(len(listn)): #'리스트'의 객체 수만큼 반복
print(listn[j]) #오류인 부분, 리스트 요소를 반복해서 출력하는 것이 아니다.
#무엇보다, 중복 여부를 검사하는 기능이 누락되었다.
#두번재 시도(오류)
t=int(input()) #테스트 케이스 수 입력
listn=[] #문자열을 저장할 리스트 선언
for i in range(t): #테스트 케이스만큼 반복
n=input() #추가할 문자열 입력
listn.append(n) #입력한 문자열 리스트에 추가
listn.sort(key=len) #길이순으로 리스트 안에 있는 객체들을 정렬
for j in range(len(listn)): #'리스트'의 객체 수만큼 반복
print(j) #수정한 부분, 리스트 요소대신 저장된 요소를 출력하게 바뀌었다.
#하지만 중복 여부를 검사하는 기능이 여전히 누락되었다.
#세번재 시도(오류)
t=int(input()) #테스트 케이스 수 입력
listn=[] #문자열을 저장할 리스트 선언
for i in range(t): #테스트 케이스만큼 반복
n=input() #추가할 문자열 입력
if n not in listn: # 중복 여부 확인을 추가했다
listn.append(n) #입력한 문자열 리스트에 추가
listn.sort(key=len) #길이순으로 리스트 안에 있는 객체들을 정렬
for j in listn: #'리스트'의 객체 수만큼 반복
print(j) #리스트에 저장된 요소를 출력
#얼핏 보면 완성된 코드처럼 보이지만, 이 정렬에는 한가지 오류가 있다. 일단 사전순으로 한번 정렬한 뒤,
#길이순으로 정렬해야 올바른 정렬이 된다.
최종 코드
t=int(input())
listn=[]
for i in range(t):
n=str(input())
if n not in listn: # 중복 여부 확인
listn.append(n) #중복이지 않을 경우 리스트에 입력한 요소 추가
listn.sort() #사전순으로 한번 정렬(EX: 앞자리 알파벳순으로 정렬)
listn.sort(key=lambda x:len(x)) #단어 길이별로 정렬(길이가 같은 경우 사전순으로 이미 정렬되어 있음)
for j in listn:
print(j)
'백준 > python' 카테고리의 다른 글
1475: 방 번호(python) (0) | 2023.09.13 |
---|---|
1427: 소트인사이드(python) (0) | 2023.09.13 |
1789: 수들의 합(python) (0) | 2023.09.13 |
1357: 뒤집힌 덧셈(python) (0) | 2023.09.13 |
2747번: 피보나치 수(python) (0) | 2023.09.13 |