Koala - 4기

[BOJ 22252] : 정보 상인 호석

Chamming2 2021. 7. 23. 23:48

자바스크립트를 주로 사용해와서 보자마자 아래와 같은 데이터 구조를 만들면 되겠구나! 생각했지만, 파이썬에서는 나름 생각할게 많았던 문제였습니다.

const infos = {
    Cpp: [1, 2, 3, 4, 5],
    python: [1, 2, 3, 4]
    ...
}

우선 구현해야 할 것은 명확했는데, 파이썬의 딕셔너리(C++의 맵과 유사합니다!)를 활용해 (키 : 값) 쌍을 (정보 이름 : 정보 값이 담긴 우선순위 큐) 형태로 만들어주면 될 것 같았습니다.

그래서 처음에는 infoMap = dict([name, infoHeap]) 처럼 코드를 작성해 문제를 풀려 했는데, 파이썬의 딕셔너리는 C++과 다르게 "문자열 : 리스트" 타입의 맵으로 초기화할수 없다는 것을 알게 되었습니다.

다만 초기화가 아닌, 빈 맵을 먼저 정의해두고 여기서 키 - 값 쌍을 통해 리스트를 추가하면 되는 것을 확인할 수 있었는데요, 이게 말로 설명하기 기묘해 코드로 기록을 남겨봅니다.

mapWithStringAndList1 = {"key", []} # error : unhashable type: 'list'
mapWithStringAndList2 = dict(["key", []]) # error : dictionary update sequence ...

mapWithStringAndList3 = {}
mapWithStringAndList3["key"] = [] # OK

따라서 1, 2번 방법으로는 "키 - 배열" 쌍을 생성할 수 없음을 깨닫고 try-except 구문과 3번 방법을 사용함으로써 맵을 구현할 수 있었습니다.

+ 추가 : 제가 바보였네요! 딕셔너리를 추가할 때는 mapWithStringAndList1 = {"key" : []} 이렇게 콜론으로 구분해줘야 하는걸 깜빡했네요....

import sys
import heapq

input = sys.stdin.readline

T = int(input())

infoHeap = {}
score = 0

for _ in range(T):
    temp = input().split()
    q, name, k = int(temp[0]), temp[1], int(temp[2])
    if q == 1:
        infos = temp[3:]
        try:
            for infoValue in infos:
                heapq.heappush(
                    infoHeap[name], (-1 * int(infoValue), int(infoValue)))
        except:
            infoHeap[name] = []
            for infoValue in infos:
                heapq.heappush(infoHeap[name],
                               (-1 * int(infoValue), int(infoValue)))
    elif q == 2:
        for i in range(k):
            try:
                score += heapq.heappop(infoHeap[name])[1]
            except:
                break

print(score)

간만에 깔끔하게 풀린 문제였습니다!