알고리즘

백준 1812번 사탕 (JAVA)

박카스마시며코딩 2023. 9. 17. 19:37

https://www.acmicpc.net/problem/1812

 

1812번: 사탕

첫째 줄에 N(3 ≤ N ≤ 999, N은 홀수)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 1번 학생과 2번 학생이 가지고 있는 사탕의 수의 합, 2번 학생과 3번 학생이 가지고 있는 사탕의 수의 합, …, N-1번 학

www.acmicpc.net

 

저는 dfs를 통해 문제를 해결하였습니다.

처음 것은 될 수 있는 만큼 캔디를 넣고, 그 다음 것은 앞의 캔디와 주어진 입력을 참조하여 값을 결정하였습니다.

마지막으로 마지막 뎁스까지 가면 마지막 입력값과 마지막 캔디 + 처음 캔디인지를 확인하여 문제를 해결하였습니다.

 

package BOJ.etc;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.function.Function;

public class BOJ_1812 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Function<String,Integer> stoi = Integer::parseInt;
        int n = stoi.apply(br.readLine());
        int[] candySum = new int[n];
        for(int i = 0 ; i < n ; i++){
            candySum[i] = stoi.apply(br.readLine());
        }
        int[] candy = new int[n];
        cal(0,candy,candySum,n);
        for(int i = 0 ; i < n ; i++){
            System.out.println(result[i]);
        }
    }
    public static int[] result = null;
    private static void cal(int depth,int[] candy, int[] candySum, int n) {
        if(depth >= n){
            if(candy[0] + candy[n-1] != candySum[n-1]){
                return;
            }
            result = Arrays.copyOf(candy,n);
            return;
        }
        if(depth == 0){
            for(int i = 0 ; i <= candySum[depth] ; i++){
                candy[depth] = i;
                if(candySum[n-1] - i < 0){
                    break;
                }
                candy[n-1] = candySum[n-1] - i;
                cal(depth+1,candy,candySum,n);
            }
        }else{
            int prevIndex = depth - 1;
            if(candySum[prevIndex] - candy[prevIndex] < 0){
                return;
            }
            candy[depth] = candySum[prevIndex] - candy[prevIndex];
            cal(depth+1,candy,candySum,n);
        }
    }
}