이항 계수1

김나영·2023년 5월 30일
0

알고리즘

목록 보기
6/16

문제


풀이

이항 계수에 대해 먼저 알고 넘어가야함

이항 계수란?

  • 이항 정리 에서 계수 로 나타나는 양의 정수

위의 자료를 참고하여 팩토리얼 함수를 사용하여 만들면

factorial(N) / (factorial(N - K) * factorial(K))
  • 팩토리얼이란?

    : ‘수를 단계적으로 곱한다.’는 뜻으로 숫자 옆에 !표를 붙어서 표현

재귀 호출문을 사용하여 코드를 만들기

재귀호출이란?

  • 함수 내부에서 해당 함수가 다시 호출되는 것을 의미

  • 이러한 호출은 자기자신을 계속호출하기 때문에 끝없이 반복될 수 있으며 반드시 재귀호출을 중단하도록 조건 명령문을 반드시 포함

  • 재귀호출을 사용하는 이유는 코드의 목적과 가독성 때문

  • 반복문으로 표현된 경우, 이 반복문이 어떤 목적인지 코드를 모두 해석해야 의미를 파악 가능

EX)

1 ~ 10까지 곱하는 프로그램을 만든다고 가정할 때
1 ~ 10까지의 곱은 1 ~ 9까지의 곱의 곱하기 10
1 ~ 9까지의 곱은 1 ~ 8까지의 곱의 곱하기 9
1 ~ 8까지의 곱은 1 ~ 7까지의 곱의 곱하기 8
...
1 ~ 2까지의 곱은 1 ~ 1까지의 곱의 곱하기 2
마지막으로 1 ~ 1까지의 곱은 1
이를 코드로 작성하면
1. n 이 1이 아니면, n 과 1 부터 n-1 까지의 곱을 곱한 값을 반환
2. n 이 1이면, 1을 반환

public static void main(String[] args) {
        int result = factorial(10);
        System.out.println(result);
    }
    static int factorial(int N) {
        if (N == 1) {
            return 1;
        } else {
            return N * factorial(N - 1);
        }
    } // 3628800 출력

factorial(0) = 1이기 때문에 N <= 1

 static int factorial(int N) {
        if (N <= 1) { //  factorial(0) == 1
            return 1;
        } else {
            return N * factorial(N - 1);
        }
    }

출력하기

System.out.println(factorial(N) / (factorial(K) * factorial(N - K)));

혹은 분모, 분자 나눠서도 가능

 int up = factorial(N); // 분자
 int down = factorial(K) * factorial(N - K); // 분모
 int result = up / down;
    System.out.println(result);

전체 코드

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int K = sc.nextInt();
        int up = factorial(N); // 분자
        int down = factorial(K) * factorial(N - K); // 분모
        int result = up / down;
        System.out.println(result);
// System.out.println(factorial(N) / (factorial(K) * factorial(N - K)));
    }
    static int factorial(int N) {
        if (N <= 1) { //  factorial(0) == 1
            return 1;
        } else {
            return N * factorial(N - 1);
        }
    }
}

처음 도전한 코드

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int K = sc.nextInt();
         System.out.println(factorial(N) / factorial(K) * factorial(N - K));
    static int factorial(int N) {
        if (N <= 1) { //  factorial(0) == 1
            return 1;
        } else {
            return N * factorial(N - 1);
        }
    }
}

1시간 넘게 왜 틀렸는지 찾아봐도 답이 나오지 않아 다른 사람에게 보여줬는데 아주 간단한 코드에서 문제가 있었다는 것을 발견

factorial(N) / factorial(K) * factorial(N - K)

factorial(K) * factorial(N - K) 식이 수학문제를 푸는 것처럼 당연히 분모로 내려간다고 생각해 ()기 필요하다라는 생각을 못함
헷갈림을 방지하기 위해 아래의 코드와 같이 분모, 분자를 나눠서 코드를 만드는 것도 하나의 방법이라는 걸 깨닫게 됨

int up = factorial(N); // 분자
int down = factorial(K) * factorial(N - K); // 분모
int result = up / down;
   System.out.println(result);

0개의 댓글