백준 22252번
https://www.acmicpc.net/problem/22252
문제
후기
골드 문제중에서는 꽤 쉬운편에 속하는 문제라고 느꼈다.
list를 입력받으면서 맨 앞의 숫자가 1이면 dictionary에 정보를 추가하고 ,
맨 앞의 숫자가 2이면 dictionary에서 pop해서 result에 더해주는 문제였다.
defaultdict 자료형을 사용하여 dictionary에 가지고 있는 정보의 가치를 추가했고,
내림차순으로 정렬해서, 맨 앞부터 정보를 가져왔다.
index에러가 한 번 발생했는데, 가지고 있는 정보의 개수보다 큰 숫자가 나오는 입력이 존재했다.
그래서 더이상 구매할 수 있는 정보가 없으면 break 하는 방법을 사용했다.
python3로는 시간 초과가 나오고, pypy로는 성공적으로 채점이 완료되는데,
내 실력이 더 늘면 시간을 더 줄일 수 있는 방향을 고려해봐야겠다.
import sys
input= sys.stdin.readline
from collections import defaultdict
li= defaultdict(list) #defaultdict 자료형
N = int(input())
result = 0
for _ in range(N):
word = list(map(str,input().rstrip().split()))
check = int(word[0]) #정보를 추가하는지, 구매하는지
name = word[1]
info = word[3:] #정보의 종류
if check == 1: #1일때는 정보를 추가한다.
for i in info:
li[name].append(int(i))
if check == 2: #2일때는 정보를 구매한다.
if name in li.keys():
for key, values in li.items():
li[key] = sorted(values, reverse=True) #내림차순으로 value를 정리해주고
k = li.get(name)
for i in range(int(word[2])): #word[2] 에 해당하는 횟수만큼 정보를 구매한다.
if len(li[name])==0: #가지고 있는 정보가 더이상 없으면 break
break
result += k[0] #정보를 구매한후
li[name].remove(k[0]) #해당 정보를 삭제한다.
print(result)