https://www.acmicpc.net/problem/1181
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
입력
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
출력
조건에 따라 정렬하여 단어들을 출력한다.
코드 정답
import sys
input = sys.stdin.readline
n = int(input())
li = []
for _ in range(n):
li.append(input().strip())
set_li = set(li)
li = list(set_li)
li.sort()
li.sort(key=len)
for i in li:
print(i)
풀이
1~2행 : input 자체는 느리기에 sys.stdin.readline 을 input 처럼 사용해줘야 한다. 사용하기 위해서는 import sys 를 헤더로선언해주어야 하며 input 에 sys.stdin.readline 을 대입해줌으로서 input 의 속도를 빠르게 만들 수 있다.
import sys
input = sys.stdin.readline
4~8행 : 입력을 받아 변수 n 에 대입하고 li 라는 변수는 리스트 형식으로 만들어준다.
이후 n 만큼 반복문을 돌리며 입력된 값을 li 의 인덱스에 순서대로 넣어주게 된다.
.strip() 을 사용해준 이유는 input() 만을 사용하게 된다면 char 형식으로 저장이 되는데 그렇게 된다면 \n 까지 끝에 저장이 되어 입력이 a b c 입력이 된다고 하였을 때, a\n b\n c\n 으로 저장이 되어 한 줄씩 띄워지는 현상이 발생한다. 그렇기 때문에 strip() 을 사용하여 공백을 지워주었다.
n = int(input())
li = []
for _ in range(n):
li.append(input().strip())
10~13행 : 리스트 li 에 저장된 값들을 set을 이용해 집합 자료형으로 변환시켜준다. 집합 자료형의 특징 중에는 중복을 제거시키는 것이 존재하므로 입력되어 있는 값들 중에서 중복을 한 번에 없애줄 수 있다. 이후 중복이 사라진 set_li 변수를 다시 list 로 형변환 시켜주며 li 변수에 대입시킨다.
중복이 걸러진 리스트를 정렬을 시키고 다시 한 번 정렬을 시키게 된다. 그냥 sort() 만 사용하게 된다면 a~z 까지의 순서대로 정렬이 되는데, 문제에서 바라는 것은 길이에 따라 정렬되는 것도 바라기에 key=len 조건을 붙여줌으로 길이에 대한 정렬도 해주는 것이다.
set_li = set(li)
li = list(set_li)
li.sort()
li.sort(key=len)
15~16행 : li 에 저장된 인덱스 값들을 i 에 대입하며 값이 존재하지 않을 때까지 반복을 하게 된다. i 에는 li 인덱스 값들이 저장되어 있기에 입력되고 정렬된 순서대로 값이 출력이 된다.
for i in li:
print(i)
'BaekJoon > 단계별로 풀어보기' 카테고리의 다른 글
[백준] 정렬 - 18870번 (Python) (0) | 2023.02.19 |
---|---|
[백준] 정렬 - 10814번 (Python) (0) | 2023.02.18 |
[백준] 정렬 - 11651번 (Python) (0) | 2023.02.13 |
[백준] 정렬 - 11650번 (Python) (0) | 2023.02.12 |
[백준] 정렬 - 1427번 (Python) (0) | 2023.02.10 |