[BOJ]백준#22252 Gold 5 정보상인호석💾💽(Python, 파이썬)

임준성·2022년 8월 19일
0

백준 Algorithm

목록 보기
52/59
post-thumbnail

백준 22252번
https://www.acmicpc.net/problem/22252

문제



후기

⏰ 풀이시간 30분 ++⏰

골드 문제중에서는 꽤 쉬운편에 속하는 문제라고 느꼈다.

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)     
profile
아무띵크 있이

0개의 댓글