strip() 함수는 문자열에서 양쪽 끝에 있는 공백 문자 (스페이스, 탭, 개행 문자 등)을 제거하는 역할을 한다. 여기서 rstrip() 함수를 사용하는 이유는 sys.stdin.readline()을 사용해서 input값을 받게되면 개행이 포함된 입력값을 받기 때문이다.
get 함수는 딕셔너리에 존재하지 않는 키를 참조하려고 하면 에러가 발생하기 때문에 존재하지 않는 키를 참조하려고 할 위험이 조금이라도 있는 경우에 사용한다. get 메서드를 사용하면 참조하고자 하는 키가 존재하지 않더라도 에러를 발생시키지 않고 None 값을 리턴해준다.
word_list = word_cnt.keys() 를 실행하면 dict_keys(['apple', 'sand', 'append']) 의 결과가 나오게된다.
dict_keys(['apple', 'sand', 'append'])는 파이썬의 딕셔너리에서 키(key)들을 나타내는 뷰(view) 객체이다. 딕셔너리에서 keys() 메서드를 호출하면 딕셔너리의 키(key)들을 나타내는 이러한 뷰 객체가 반환된다.
뷰 객체는 딕셔너리의 키(key) 집합을 나타내며, 리스트와 유사하지만 몇 가지 중요한 차이점이 있다.
동적 뷰: 뷰 객체는 딕셔너리가 변경될 때 자동으로 업데이트된다. 딕셔너리의 키(key)를 추가, 삭제, 수정하는 경우 뷰 객체도 함께 업데이트된다.
리스트와 유사하지만 아님: 뷰 객체는 리스트와 비슷하게 키(key)들을 반복할 수 있지만, 리스트처럼 인덱스로 접근하거나 슬라이싱할 수는 없다.
따라서 dict_keys(['apple', 'sand', 'append'])은 딕셔너리에서 키(key) 집합을 나타내며, 이를 리스트로 변환하려면 list() 함수를 사용할 수 있다. 예를 들어,
key_list = list(dict_keys(['apple', 'sand', 'append']))
위의 코드를 실행하면 key_list에는 리스트 ['apple', 'sand', 'append']가 저장된다. 이렇게 변환한 리스트를 통해 리스트처럼 인덱스로 접근하거나 슬라이싱할 수 있다.
import sys
N, M = map(int, sys.stdin.readline().split())
word_cnt = dict()
for _ in range(N):
word = sys.stdin.readline().rstrip()
if len(word) < M:
continue
if not word_cnt.get(word):
word_cnt[word] = 1
else:
word_cnt[word] += 1
word_list = word_cnt.keys()
word_list = sorted(word_list, key=lambda x: (-word_cnt[x], -len(x), x))
for word in word_list:
print(word)