문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
입력
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
출력
조건에 따라 정렬하여 단어들을 출력한다.
예제 입력 1
13
but i wont hesitate no more no more it cannot wait im yours |
예제 출력 1
i
im it no but more wait wont yours cannot hesitate |
작성 코드:
import sys
n=int(input())
arr=[]
for _ in range(n):
arr.append(sys.stdin.readline())
arr=list(set(arr)) #중복제거 후, 리스트 자료형으로 변환
arr.sort() #사전 순으로 정렬
arr.sort(key=len) #길이가 짧은 것부터 정렬
for i in range(n):
print(arr[i])
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
라는 조건이 있으므로, 사전 순으로 먼저 정렬해주고, 길이대로 정렬해준다.
정렬 순서를 주의) 상위 조건 A와 하위 조건 B가 있으면
먼저 B로 정렬을 한 후에 A로 정렬을 해야 원하는 결과를 얻을 수 있다.
그런데 위와 같이 제출하면 출력형식 오류가 발생한다.
sys.stdin.readline()은 '\n'을 포함하는 입력이기 때문에 연속으로 값을 입력받는 for문에서 에러가 발생했다.
sys.stdin.readline()은 한줄 단위로 입력받기 때문에, 개행문자가 같이 입력 받아진다는 것을 기억.
+) 변수 타입이 str 형태이기 때문에 정수로 사용하기위해선 형변환 필요
아무튼, 개행문자를 제거해주기위해 strip()을 사용한다.
strip(), rstrip(), lstrip() 의 종류가 있는데, 차이점은 다음과 같다.
위 문제에서는 strip()을 써도 되고, rstrip()을 써도 된다.
import sys
n=int(input())
arr=[]
for _ in range(n):
arr.append(sys.stdin.readline().strip())
arr=list(set(arr)) #중복제거 후, 리스트 자료형으로 변환
arr.sort() #사전 순으로 정렬
arr.sort(key=len) #길이가 짧은 것부터 정렬
for i in arr:
print(i)
참고로 마지막 for-loop 부분 코드를 위 코드처럼 for i in range(n): print(arr[i])로 했더니 런타임에러가 발생하더라.
'Back-end > 백준(python)' 카테고리의 다른 글
★[백준/python] 18870 좌표압축: dictionary/ list.index(i) , dictionary[i]의 시간복잡도 (1) | 2023.10.27 |
---|---|
★[백준/python] 10814 나이순정렬: stable정렬, unstable정렬/ lambda (0) | 2023.10.27 |
★[백준/python] 11651 좌표정렬하기2: 11650과 코드 비교해보기 (0) | 2023.10.27 |
★[백준/python] 11650 좌표정렬하기: (1) | 2023.10.27 |
[백준/python] 1427 소트인사이드: 자릿수대로 잘라서 리스트에 넣기 (0) | 2023.10.27 |