BOJ Code/Gold

[백준/BOJ] gold3 - 2629번 양팔저울 (Python)

NIMHO 2023. 2. 5. 22:18
728x90

▶2629 - 양팔저울

문제

양팔 저울과 몇 개의 추가 주어졌을 때, 이를 이용하여 입력으로 주어진 구슬의 무게를 확인할 수 있는지를 결정하려고 한다.

무게가 각각 1g과 4g인 두 개의 추가 있을 경우, 주어진 구슬과 1g 추 하나를 양팔 저울의 양쪽에 각각 올려놓아 수평을 이루면 구슬의 무게는 1g이다. 또 다른 구슬이 4g인지를 확인하려면 1g 추 대신 4g 추를 올려놓으면 된다.

구슬이 3g인 경우 아래 <그림 1>과 같이 구슬과 추를 올려놓으면 양팔 저울이 수평을 이루게 된다. 따라서 각각 1g과 4g인 추가 하나씩 있을 경우 주어진 구슬이 3g인지도 확인해 볼 수 있다.

<그림 1> 구슬이 3g인지 확인하는 방법 (1은 1g인 추, 4는 4g인 추, ●은 무게를 확인할 구슬)

<그림 2>와 같은 방법을 사용하면 구슬이 5g인지도 확인할 수 있다. 구슬이 2g이면 주어진 추를 가지고는 확인할 수 없다.

추들의 무게와 확인할 구슬들의 무게가 입력되었을 때, 주어진 추만을 사용하여 구슬의 무게를 확인할 수 있는지를 결정하는 프로그램을 작성하시오.

<그림 2> 구슬이 5g인지 확인하는 방법

 

입력

첫째 줄에 3개의 정수 N, P, Q가 주어진다. 첫째 줄에는 추의 개수가 자연수로 주어진다. 추의 개수는 30 이하이다. 둘째 줄에는 추의 무게들이 자연수로 가벼운 것부터 차례로 주어진다. 같은 무게의 추가 여러 개 있을 수도 있다. 추의 무게는 500g 이하이며, 입력되는 무게들 사이에는 빈칸이 하나씩 있다. 세 번째 줄에는 무게를 확인하고자 하는 구슬들의 개수가 주어진다. 확인할 구슬의 개수는 7 이하이다. 네 번째 줄에는 확인하고자 하는 구슬들의 무게가 자연수로 주어지며, 입력되는 무게들 사이에는 빈칸이 하나씩 있다. 확인하고자 하는 구슬의 무게는 40,000보다 작거나 같은 자연수이다.

 

출력

주어진 각 구슬의 무게에 대하여 확인이 가능하면 Y, 아니면 N을 차례로 출력한다. 출력은 한 개의 줄로 이루어지며, 각 구슬에 대한 답 사이에는 빈칸을 하나씩 둔다.

728x90

풀이

dp를 2차원 list로 만들어줬다.

이때 한쪽으로 최대 sum(arr)만큼 누적될 수 있기 때문에, 그만큼 할당해 줬다.

 

이중 for문을 이용해서 dp를 채워주면 된다.

일단 dp[0][0]을 1로 해준다음에 시작한다.

이전의 값이 채워졌을 때 1이기에, 그다음 추를 왼쪽, 오른쪽에 넣는 것과 안 넣는 경우를 모두 해준다.

dp[i + 1][j] = 1
dp[i + 1][j + arr[i]] = 1
dp[i + 1][abs(j - arr[i])] = 1

좌우 값의 차이만 알면 되기에, 추를 사용하지 않을 때는 그냥 [j]

큰 쪽에 넣을 때는 [j + arr[i]], 작은 쪽에 넣을 때는 abs([j - arr[i]])를 해주면 된다.

n = int(input())
arr = list(map(int, input().split()))
m = int(input())
arr2 = list(map(int, input().split()))

answer = []
dp = [[0 for _ in range(sum(arr) + 1)] for _ in range(n + 1)]
dp[0][0] = 1

for i in range(n):
    for j in range(sum(arr) + 1):
        if dp[i][j] == 1:
            dp[i + 1][j] = 1
            dp[i + 1][j + arr[i]] = 1
            dp[i + 1][abs(j - arr[i])] = 1

for a in arr2:
    if a <= sum(arr) and dp[n][a] == 1:
        answer.append('Y')
    else:
        answer.append('N')
print(*answer)

굳이 answer를 만들지 않고 바로 출력을 해줘도 된다.

하지만, 나는 입력할 때 중간에 출력되는 것을 별로 안 좋아해서,

answer에 모두 담은 다음에 한 번에 출력해 준 것이다.

728x90