즐거운 PS 👩‍💻🥰

[백준-파이썬] 22252: 정보 상인 호석

dalin❤️ 2021. 10. 8. 10:14

문제 보러 가기!

생각보다는 쉬웠다.. 요즘 한번에 통과한 적이 많지 않은데, 오랜만에 한번에 통과해서 기분이 좋다 ~ 😆

아이디어 ❕

딕셔너리를 활용해서 풀었다!
상황을 나누고, 상황마다 어떤 행동을 해야 할지 생각해서 코딩했다.

  1. 숫자 1이 들어왔을 때
    이름, K개, 각 가치를 각각 저장함(각각의 가치는 리스트로 저장)
    1) 처음 나오는 고릴라이면, 딕셔너리에 저장(key는 고릴라 이름, value는 정보의 가치들을 리스트 형태로)
    2) 전에 나왔던 고릴라이면, 딕셔너리에 추가된 정보 부분만 추가함(extend 를 썼다. 알고만 있었는데, 이걸 써보는 건 처음인 것 같다 ㅎㅎ)

  2. 숫자 2가 들어왔을 때
    이름, B개를 각각 저장
    1) 그 고릴라가 있는지 체크(혹시 몰라서)

     있으면 그 딕셔너리의 value(리스트 형태! 정보 가치들이 저장되어있음)를 내림차순으로 정렬했다.
     1-1) B개 이하이면 정보를 모두 구매하고, 그 고릴라 이름 key를 아예 없앴다.
     1-2) B개 초과이면 B개 정보만 구매하고, 구매한 정보들은 파기하게 했다. (리스트 슬라이싱 활용)

코드 👩‍💻

import sys

input = sys.stdin.readline

Q = int(input())
information_gorillas = {}
hosuk_information_value_sum = 0

for _ in range(Q):
    query = input().split()

    if query[0] == '1':  # 정보 얻은 고릴라 이름, 정보의 개수, 정보의 가치
        name = query[1]
        K = int(query[2])
        K_values = list(map(int, query[3:]))

        if information_gorillas.get(name):  # 이미 나온 적 있는 고릴라이면 추가된 정보관련 내용을 추가
            information_gorillas[name].extend(K_values)

        else:  # 처음 나온 고릴라이면
            information_gorillas[name] = K_values

    elif query[0] == '2':  # 호석이가 접촉한 고릴라, 호석이가 구매하는 정보의 개수
        name = query[1]
        B = int(query[2])

        # 그 고릴라가 있는지 체크
        if information_gorillas.get(name):
            # 있으면 정보 가치에 따라서 내림차순 정렬
            information_gorillas[name].sort(reverse=True)

            # B개 이하일 경우 정보 모두 구매, 고릴라 삭제
            if len(information_gorillas[name]) <= B:
                hosuk_information_value_sum += sum(information_gorillas[name])
                del information_gorillas[name]
            else:  # B게 보다 많다면
                # B개 정보를 구매하고
                hosuk_information_value_sum += sum(information_gorillas[name][:B])
                # 고릴라는 그 정보를 파기하기
                information_gorillas[name] = information_gorillas[name][B:]

print(hosuk_information_value_sum)
728x90