[PS] BOJ 29714 / 브실이의 구슬 아이스크림

[PS] BOJ 29714 / 브실이의 구슬 아이스크림
문제 링크: https://www.acmicpc.net/problem/29714
Thumbnail: Photo by Elza Kurbanova (Unsplash)

여러분은 어떤 아이스크림을 좋아하시나요? 저는 메로나를 제일 좋아합니다 😄

풀이

​태그에 해시를 이용한 집합과 맵이 있듯이, Map 자료구조를 이용하면 간단히 풀이할 수 있습니다. 기본적인 원리는 "각 아이스크림 구슬이 몇 개 있는지 파악하자" 입니다. 저는 파이썬의 내장 객체인 dict를 활용했습니다.

먼저, 초기 입력으로 주어진 아이스크림을 구슬의 색깔을 키, 구슬의 개수를 값으로 하는 맵 자료구조 형태로 저장합니다. 이 Map은 ICE_CREAM이라고 부르겠습니다.

이후 매 차례 아이스크림을 먹을 때 마다, \(A_i\)를 동일한 방식으로 Map에 정리합니다. 이후, ICE_CREAM이 \(A_i\)에 저장된 각 아이스크림 구슬을 같거나 더 많이 가지고 있는지 비교합니다. 다 가지고 있다면, ICE_CREAM에서 \(A_i\)을 뺀 뒤, \(B_i\)를 더해줍니다.

위 과정을 모두 반복한 뒤, 출력에서는 ICE_CREAM의 각 키를 자신의 값만큼 반복해서 출력해주면 됩니다.

전체 코드

input = open(0).readline
N = int(input())
ICE_CREAM = {}
for ice in map(int, input().split()):
    try:
        ICE_CREAM[ice] += 1
    except KeyError:
        ICE_CREAM[ice] = 1

Q = int(input())
for _ in range(Q):
    a_i, *A = map(int, input().split())
    b_i, *B = map(int, input().split())
    a = {}
    for ice in A:
        try:
            a[ice] += 1
        except KeyError:
            a[ice] = 1
    if all(ICE_CREAM.get(ice, 0) >= a[ice] for ice in a): # 모든 아이스크림이 존재하는지 확인
        for ice in a:
            ICE_CREAM[ice] -= a[ice]
            if ICE_CREAM[ice] == 0:
                del ICE_CREAM[ice]
        for ice in B:
            try:
                ICE_CREAM[ice] += 1
            except KeyError:
                ICE_CREAM[ice] = 1

res = []
for ice in ICE_CREAM:
    for _ in range(ICE_CREAM[ice]):
        res.append(str(ice))
print(len(res))
if ICE_CREAM:
    print(" ".join(res))

solution.py