자바스크립트를 주로 사용해와서 보자마자 아래와 같은 데이터 구조를 만들면 되겠구나! 생각했지만, 파이썬에서는 나름 생각할게 많았던 문제였습니다.
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)
간만에 깔끔하게 풀린 문제였습니다!
'Koala - 4기' 카테고리의 다른 글
[BOJ] 22252 정보상인 호석 (0) | 2021.07.24 |
---|---|
[BOJ] 1719 택배 (0) | 2021.07.24 |
[BOJ] 22252 정보 상인 호석 (0) | 2021.07.23 |
백준 22252 정보 상인 호석 풀이 (0) | 2021.07.23 |
[BOJ] 상어 중학교 21609 (0) | 2021.07.22 |