백준 - 이항계수 1[java]

스브코·2021년 11월 26일
0
post-custom-banner

문제 출처: https://www.acmicpc.net/problem/11050

문제 설명

두 자연수의 이항계수를 구하는 프로그램을 작성하시오

이항계수 구하는 법: (N, K) 일때 N!/(K!(N-K)!)

예제 입력

5 2

예제 출력

10

문제 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String [] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
        int result = 1;
        for(int i = n - k + 1; i <= n; i++)
            result *= i;
        for(int i = 2; i <= k; i++)
            result /= i;
        br.close();
        System.out.println(result);
    }
}

다른 풀이

//이항계수
public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        // nCk = n! / ((n-k)! * k!)
        System.out.println(factorial(N) / (factorial(N - K) * factorial(K)));
    }

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

백준에 제출된 코드 줄 자바에서는 제일 빠른 코드이다.

정적 메소드를 사용하여 더 빠른것 같다.

정적 메소드를 사용하면 빠른 이유

JVM이 시작될때 static영역에 저장되어 프로그램이 끝날때까지 사라지지 않고 메모리에 남아있어서 실행될때 더 빠른것 같다.
코딩테스트에서는 효율도가 올라갈지 몰라도 정적 메소드의 잦은 사용은 객체 지향에서 멀어지고 메모리 효율이 떨어지는 단점이 있다고 한다.[출처]

profile
익히는 속도가 까먹는 속도를 추월하는 그날까지...
post-custom-banner

0개의 댓글