알고리즘/BOJ

[BOJ] 2629. 양팔저울

재담 2022. 3. 17. 02:14

문제 원본 : https://www.acmicpc.net/problem/2629

 

2629번: 양팔저울

첫째 줄에는 추의 개수가 자연수로 주어진다. 추의 개수는 30 이하이다. 둘째 줄에는 추의 무게들이 자연수로 가벼운 것부터 차례로 주어진다. 같은 무게의 추가 여러 개 있을 수도 있다. 추의 무

www.acmicpc.net

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[] arr = new int[n];
        int[] arr2 = new int[10000];
        int[] dp = new int[40001];
        int cnt = 0;
        for (int i = 0; i < n; ++i) {
            arr[i] = Integer.parseInt(st.nextToken());

            dp[arr[i]] = 1;
            arr2[cnt++] = arr[i];

            int tmp = cnt - 1;
            for (int j = 0; j < tmp; ++j) {
                if (dp[arr[i] + arr2[j]] == 0) {
                    dp[arr[i] + arr2[j]] = 1;
                    arr2[cnt++] = arr[i] + arr2[j];
                }
            }
        }

        Arrays.sort(arr2, 0, cnt);

        for (int i = 1; i < cnt; ++i) {
            for (int j = 0; j < i; ++j) {
                dp[arr2[i] - arr2[j]] = 1;
            }
        }

        int m = Integer.parseInt(br.readLine());
        st = new StringTokenizer(br.readLine());
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < m; ++i) {
            if (dp[Integer.parseInt(st.nextToken())] == 1) {
                builder.append("Y ");
            } else {
                builder.append("N ");
            }
        }

        bw.write(builder.toString());

        bw.close();
        br.close();
    }
}
  • 다이내믹 프로그래밍 문제
  • 첫 이중 for 문은 추를 한쪽에 한 개씩 전부 올리는 경우를 계산한다.
  • 두 번째 이중 for 문은 한쪽에 두 개 이상 올려져 있을 때 반대쪽으로 옮기는 경우를 계산한다.