본문 바로가기
알고리즘 이전/재귀, DFS, BFS, Tree, Graph

조합 구하기(메모리제이션)

by hoshi03 2023. 8. 24.

nCr = (n-1)C(r-1) + (n-1)C(r) 조합공식을 이용해서 조합 값 구하기

nCr에서 n=r이나 r이 0이되면 1을 리턴하니 dfs로 구하는 코드를 짜면 

 

    public int dfs(int n, int r){
        //nCr에서 n=r이나 r이 0이면 1
        if (n == r || r == 0) return 1;
        else return dfs(n-1,r-1) + dfs(n-1,r);
    }

코드는 간단하지만 숫자가 커지면 너무 비효율적이다

계산 결과를 저장해뒀다가 쓰는 메모리제이션으로 계산 결과가 같은 건 저장해둬서 효율적으로 써보자

 

    public int dfs(int n, int r){
        // 이미 nCr할 값을 구해서 배열에 저장해뒀으면
        if (ch[n][r] > 0 ) return ch[n][r];

        //nCr에서 n=r이나 r이 0이면 1
        if (n == r || r == 0) return 1;
        else return ch[n][r] = dfs(n-1,r-1) + dfs(n-1,r);
    }

앞에 피보나치 수열 구할 때 처럼 값을 return ch[n][r] = dfs(n-1,r-1) + dfs(n-1,r); 형태로 저장해두고

이미 구한 값이면 더 깊이 탐색을 하지 않고 저장해둔 값을 리턴한다

 

전체 코드

 

import java.util.*;
class Main{
	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, BFS, Tree, Graph' 카테고리의 다른 글

수열 추측하기  (0) 2023.08.25
순열 구하기  (0) 2023.08.24
동전 교환  (0) 2023.08.24
DFS 중복순열  (0) 2023.08.24
최대점수 구하기  (0) 2023.08.23