알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
1. 길이가 짧은 것부터
2. 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
sort()
를 사용하면 사전 순서로 리스트를 정렬해준다. 단, 문제에서 사전 순서보다 문자열의 길이를 우선으로 정렬하라고 하였으므로 key
값을 이용해 정렬하는 우선순위를 정해주면 될 것 같다.import sys
words = set()
for _ in range(int(sys.stdin.readline())):
words.add(sys.stdin.readline().strip())
print(*sorted(words, key=lambda x: (len(x), x)), sep='\n')
set()
에 단어를 입력받았다.sort()
함수에 key
를 넣어주면 그 방식대로 정렬을 해주는데, 여기에 람다식으로 튜플을 넣어주면 요소 순서대로 정렬을 시도해준다. 가장 먼저 단어의 길이에 따라 정렬해야 하므로 len(x)
을 써주었고, 길이가 같은 문자열에 대해서는 x
를 써주어 디폴트값인 사전 순서로 정렬되게 작성했다.class WordSort:
# 문제에서 요구하는 정렬 조건을 담은 내부 메소드
def _compare(self, val1, val2):
i, j = len(val1), len(val2)
if i == j:
for n, m in zip(val1, val2):
if ord(n) != ord(m):
return ord(n) - ord(m)
return i - j
# 두 리스트를 병합하는 메소드
def merge(self, arr1, arr2):
ret = []
i = j = 0
while i < len(arr1) and j < len(arr2):
if self._compare(arr1[i], arr2[j]) < 0:
ret.append(arr1[i])
i += 1
else:
ret.append(arr2[j])
j += 1
if i < len(arr1):
ret.extend(arr1[i:])
if j < len(arr2):
ret.extend(arr2[j:])
return ret
# merge 함수를 이용하여 병합 정렬을 하는 메소드
def merge_sort(self, lst):
if len(lst) <= 1:
return lst
return self.merge(self.merge_sort(lst[:len(lst) // 2]), self.merge_sort(lst[len(lst) // 2:]))
# 퀵 정렬 메소드
def quick_sort(self, lst, start, end):
def partition(part, ps, pe):
i = ps - 1
for j in range(ps, pe):
if self._compare(part[j], part[pe]) < 0:
i += 1
part[i], part[j] = part[j], part[i]
part[i + 1], part[pe] = part[pe], part[i + 1]
return i + 1
if start >= end:
return None
p = partition(lst, start, end)
self.quick_sort(lst, start, p - 1)
self.quick_sort(lst, p + 1, end)
return lst