어흥

[백준 1821] 수들의 합 (Java) 본문

알고리즘/백준

[백준 1821] 수들의 합 (Java)

라이언납시오 2021. 3. 31. 19:39
728x90
반응형

문제 링크: www.acmicpc.net/problem/1821

 

1821번: 수들의 합

가장 윗줄에 1부터 N까지의 숫자가 한 개씩 적혀 있다. 그리고 둘째 줄부터 차례대로 파스칼의 삼각형처럼 위의 두개를 더한 값이 저장되게 된다. 예를 들어 N이 4 이고 가장 윗 줄에 3 1 2 4 가 있

www.acmicpc.net

1. 주의할 점

- 파스칼의 삼각형을 통해 공식을 유추할 수 있어야 한다

 

2. 구현

- 수가 N이면, n-1C0부터 n-1Cn-1까지 총 N개의 수가 나온다. 해당 수들이 위에 배치될 숫자가 나타난 횟수다

- 조합 값을 저장해놓기 위해 Factorial[] 배열을 통해 0!~9!사이의 수를 저장한다

- setMul() 함수를 통해 n-1C0~n-1Cn-1값에 해당하는 값을 Mul[] 배열에 할당한다

- DFS() 함수를 통해 1~N까지의 오름차순으로 순열 구하기 + 순열에 해당하는 값*Mul[]값을 Result에 계속 더하면서 DFS를 수행한다

- Result가 Sum보다 값이 커지거나 이미 Sum을 만족하는 순열을 구한 경우 Return을 수행한다

- 순열을 구했다면 Result와 Sum을 비교하고 Sum과 같다면, 순열을 구했다는 의미로 Finish값을 True로 변경하고 해당 순열을 출력한다

 

import java.util.*;
import java.lang.*;
import java.io.*;

public class Main {
    static int factorial[],mul[],ans[];
    static int N,sum;
    static boolean check[],finish=false;
    
    static void setMul(){
        for(int i=0;i<N;i++)
            mul[i] = factorial[N-1]/(factorial[N-1-i]*factorial[i]);
    }
    
    static void dfs(int idx, int result){
        if(finish || result>sum) return;
        if(idx==N){
            if(sum==result){
                for(int i=0;i<N;i++)
                    System.out.print(ans[i]+" ");
                finish=true;
            }
            return;
        }
        for(int i=1;i<=N;i++){
            if(!check[i]){
                check[i]=true;
                ans[idx]=i;
                dfs(idx+1,result+mul[idx]*i);
                if(finish) break;
                check[i]=false;
            }
        }
    }
    
	public static void main (String[] args) throws java.lang.Exception {
	    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	    String ss = br.readLine();
	    StringTokenizer st = new StringTokenizer(ss);
	    N = Integer.parseInt(st.nextToken());
	    sum = Integer.parseInt(st.nextToken());
	    //초기화
	    factorial = new int[N];
	    mul = new int[N];
	    check = new boolean[N+1];
	    ans = new int[N];
	    factorial[0]=1;
	    for(int i=1;i<N;i++)
	        factorial[i] = factorial[i-1]*i;

	    setMul();
	    dfs(0,0);
	}
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 14867] 물통 (Java)  (0) 2021.04.01
[백준 15971] 두 로봇 (Java)  (0) 2021.03.31
[백준 2003] 수들의 합 2 (C++, Java)  (0) 2021.03.31
[백준 1789] 수들의 합 (C++)  (0) 2021.03.31
[백준 2671] 잠수함식별 (C++, Java)  (0) 2021.03.30
Comments