프로그래머스 기출문제 풀이

조합의 경우수(메모이제이션)

  • 설명

Image1.jpg로 계산합니다.

하지만 여러분은 이 공식을 쓰지않고 다음 공식을 사용하여 재귀를 이용해 조합수를 구해주는 프로그램을 작성하세요.

Image1.jpg

  • 입력 : 첫째 줄에 자연수 n(3<=n<=33)과 r(0<=r<=n)이 입력됩니다.

  • 출력 : 첫째 줄에 조합수를 출력합니다.

  • 풀이

import java.util.*;

public class Main {

    static int[][] chk;

    public int DFS(int ball, int ch) {
        if(chk[ball][ch]>0) return chk[ball][ch];
        if(ball==ch || ch==0){
            return chk[ball][ch] = 1;
        } else {
            return chk[ball][ch] = DFS(ball-1, ch-1) + DFS(ball-1, ch);
        }
    }

    public static void main(String[] args) {
        Main t = new Main();
        Scanner scan = new Scanner(System.in);
        int ball = scan.nextInt();
        int ch = scan.nextInt();
        chk = new int[ball+1][ball+1];

        System.out.println(t.DFS(ball,ch));
    }
}
  • 정리
    • 첫번째로 문제를 이해하는 것이 관건
    • 5개중에 3개의 공을 뽑는다는 예시로 이해했을때 5개의 공에서 5개의 공을 모두 뽑거나, 5개의 공에서 하나도 뽑지 않는 경우의 수는 1개씩만 존재함
    • 따라서 n과 r이 동일하거나, r이 0일때까지 재귀함수 실행
    • 이때 이미 계산한 데이터를 중복적으로 돌지 않게 하기위해 chk 배열에 계산한 값들을 담아줌
    • 그리고 DFS 진입시 배열에 값이있다면 그대로 리턴

Updated: