Algorithm/BOJ

백준(BOJ) #20920 영단어 암기는 괴로워 (Python), sorted, lambda 재활

개발자 뭄뭄 2023. 4. 18. 16:53
반응형
하나의 리스트에서 이 단어가 몇 번 나왔는지 검색하려면 어떻게 해야할까.
알파벳 순, 반대로 알파벳 역순으로 정렬하려면?
tuple에서 첫번째 원소가 아닌, 두번째 원소 혹은 다른 원소로 정렬하려면?
dictionary는 중복된 키 값을 허용하지 않았던가?
효율적으로 개수를 세는 방법은?

이런 여러가지 물음표들을 머릿속에 가득 안은 채 문제를 풀었다.

일단 시간초과가 여러번 났는데, 빠른 입출력을 해주니 시간이 많이 줄었다.

백준에서 빠른 입출력 받는 방법

input()대신 sys를 사용하면 된다. 입력받으면 \n이 포함되기 때문에 rstrip()

을 함꼐 사용해야 한다.

import sys

a = sys.stdin.readline.rstrip()

python 에서 dictionary 의 특징

dictionary는 immutable한 key와 mutable한 value로 맵핑되어있는, 순서가 없는 집합이다.

키가 중복되면? ⇒ 마지막 키로 덮어씌워진다.

sorted() 메서드를 사용해서 정렬하기

list.sort()와 sorted(list)의 가장 큰 차이점은 본체를 정렬하느냐, 그대로 두느냐의 차이다.

sorted(list, key, reverse)

import sys
N, M = map(int, sys.stdin.readline().rstrip().split())
word_dict = {}

for _ in range(N):
    word = sys.stdin.readline().rstrip()
    if len(word) < M:
        continue
    else:
        if word in word_dict.keys():
            word_dict[word] += 1
        else:
            word_dict[word] = 1


sorted_dict = sorted(word_dict.items(), key=lambda item: (
    -item[1], -len(item[0]), item[0]))

for i in range(len(sorted_dict)):
    print(sorted_dict[i][0])

dictionary.items()는 key와 value를 반환한다.

key=lambda item: item[1] 로 처리하면, value에 해당하는 나온 횟수를 기준으로 (중복된 횟수) 정렬한다. Default는 오름차순이다. 하지만 -를 붙이면 내림차순으로 정렬한다.

다음으로 정렬하는 기준은 단어의 길이이다. 따라서 len(item[0]) 을 사용하여 정렬해줬다.

마지막으로 알파벳 순서로 정렬한다. 일반적인 sort()를 사용하면 알파벳 순서로 정렬된다.

sorted()를 사용하여 여러가지 기준을 사용하여 정렬하려면, 위의 예시처럼 tuple 형식을 갖춰서 등록하면 된다.


Uploaded by N2T

반응형