DFS, BFS 활용 - 0807. 조합수(메모이제이션)
private static int C[][];
private static int DFS(int n, int r) {
if(n == r) return 1;
if(r == 1) return n;
if(C[n][r] == 0) C[n][r] = DFS(n-1, r-1) + DFS(n-1 , r);
return C[n][r];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int r = sc.nextInt();
C = new int[n+1][r+1];
System.out.println(DFS(n , r));
}
int[][] dy=new int[35][35];
public int DFS(int n, int r){
if(dy[n][r]>0) return dy[n][r];
if(n==r || r==0) return 1;
else return dy[n][r]=DFS(n-1, r-1)+DFS(n-1, r);
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
int n=kb.nextInt();
int r=kb.nextInt();
System.out.println(T.DFS(n, r));
}
해당 문제는 순열 공식 에 맞추어 DFS
를 이용하여 풀 수 있다.
n
과 r
을 파라미터로 전달 받고, 재귀호출하여 n-1
, r-1
과 n-1
, r
을 넘긴다.
조건을 두어 n==r
인 경우 1
을 반환하고, r==1
인 경우 n
을 반환한다.
이 때, 이미 구한 조합에 대해 재귀 호출을 수행하게 되면 중복적으로 연산을 하게된다.
메모이제이션
해당 조합을 이미 구한 경우 배열에 저장된 값을 사용하도록한다.