728x90
https://www.acmicpc.net/problem/1181
(실버5)
1. 문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
2. 입력
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
3. 출력
조건에 따라 정렬하여 단어들을 출력한다.
4. 아이디어
1) 사용자 정의 비교함수를 이용한다. (cmp_to_key를 사용)
2) zip()을 사용하여 두 문자열을 한 글자씩 비교한다. (ord로 아스키코드값 비교)
3) set()으로 중복을 제거한다.
5. 코드
#단어 정렬(실버5)
#1. 길이가 짧은 순으로
#2. 길이가 같으면 사전 순으로
from functools import cmp_to_key
#사전 순으로 정렬
def dictionary_order(string1,string2):
# 두 문자열이 같다면 길이 비교
if len(string1) > len(string2):
return 1 #더 긴 문자가 뒤로 이동
elif len(string1) < len(string2):
return -1 # 더 짧은 문자가 앞으로 이동
else:
#두 문자열을 한 글자씩 비교
for char1, char2 in zip(string1,string2):
if ord(char1) > ord(char2):
return 1
elif ord(char1) < ord(char2):
return -1
return 0 # 두 문자열이 같으면 순서 유지
n = int(input()) #단어 갯수
voca = []
for _ in range(n):
voca.append(input())
#중복제거
voca = list(set(voca))
voca.sort(key=cmp_to_key(dictionary_order))
for word in voca:
print(word)
6. 포인트
- 사용자 비교 함수를 만들어서 사용했다.
- 사용자 비교 함수에는 인수가 두 개 와야한다.
- 첫 번째 인수가 두 번째 인수보다 작으면 -1
- 첫 번째 인수가 두 번째 인수보다 크면 1
- 두 인수가 같으면 0
7. 느낀점
- 하나라도 포인트를 놓치면 풀기 어려운 은근 섬세한 문제였다.
728x90
'알고리즘&자료구조' 카테고리의 다른 글
[백준 1991] 트리 순회 (0) | 2024.02.05 |
---|