Baekjoon Online Judge

[python]6566.애너그램 그룹

kickerLit 2021. 1. 27. 21:03

EOF 처리를 이상하게 해서 8번 런타임에러(EOFERROR)가 났다.^^

 

 

출력 기준을 맞춰 리스트를 정렬하는데 대가리 없어지는줄 알았으나 내 멱살잡고 끌고갔다.

정성스럽고 배울점이 많은 댓글을 종종 달아주시는 anonymous님이 가르쳐주셨다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import collections
 
anagrams = collections.defaultdict(list)
li = []
tmp = []
 
while True:
    try:
        word = input()
        li.append(word)
    except EOFError:
        break
 
for i in li:
    anagrams["".join(sorted(i))].append(i)
 
max_len = -1
for i in anagrams.keys():
    sorted_anagram = sorted(anagrams[i])
    max_len = max(max_len, len(sorted_anagram))
    tmp.append(sorted_anagram)
tmp.sort(key=lambda x: (max_len - len(x), x[0])) #크기별로 나열 & 사전 순으로 나열
for i in range(min(len(tmp), 5)):
    print(f'Group of size {len(tmp[i])}: {" ".join([elem for elem in sorted(list(set(tmp[i])))])} .')
cs

 

"입력은 EOF로 끝난다. "라고 되어있는데, 이것은 예외처리 문으로 처리해주는 것을 처음 알았다. 기억해야겠다.

여기서 이해하기 힘들 수 있는(내가 이해하느라 힘들었던) 부분은 tmp.sort(key=lambda x: (max_len - len(x), x[0])) 이 코드이다. 람다를 통해 sort 함수에 key를 주는데, 먼저 max-len(x)로 각 그룹의 크기가 큰 것부터 작은 순으로 정렬을 시키고 같은 크기의 그룹의 경우 제 2의 기준인 사전 순으로 정렬될 수 있게, 각 그룹의 첫번째 단어와 비교를 시킨다. 이러한 형태의 코드는 문자열 조작이나 리스트에 대한 코딩문제에 많이 쓰이는 형식이다. 익숙해지자. 

sorted()와 sort()의 차이점을 헷갈리는사람이 많은데, sorted()는 새로운 리스트를 생성하여 정렬한다. 그래서 원본에 영향을 주지 않는다. 그러나 sort()는 원본에 직접 정렬하는 함수이기 때문에 주의가 필요하다. 

배우는게 많았던 문제였다. 

 

www.acmicpc.net/problem/6566

'Baekjoon Online Judge' 카테고리의 다른 글

[python]1914.하노이 탑  (0) 2021.02.11
[python]10814.나이순 정렬  (4) 2021.02.03
[python]9020.골드바흐의 추측  (2) 2021.01.21
[python]4948.베르트랑 공준  (0) 2021.01.21
[python]1929.소수 구하기  (0) 2021.01.18