본문 바로가기

Algorithm/Baekjoon

[백준_JAVA_알고리즘] 1010 다리 놓기

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt();
        long[] resultArr = new long[T];
        
        for(int i = 0; i < T; i++) {
            int N = scanner.nextInt();
            int M = scanner.nextInt();
            long result = calculate(N, M);
            resultArr[i] = result;
        }
        
        for(int i = 0; i < T; i++) {
            System.out.println(resultArr[i]);
        }
        scanner.close();
    }
    
    private static long calculate(int N, int M) {
        long result = 1;

        for (long i = M; i > M - N; i--)
            result *= i;

        for (long i = 2; i <= N; i++)
            result /= i;

        return result;
    }
}

다음과 같이 코드를 작성하니 오버플로우가 발생했다.

입력 처리 부분을 Scanner가 아닌 BufferedReader로 변경했다

 


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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(bufferedReader.readLine());
        long[] resultArr = new long[T];
        
        for (int i = 0; i < T; i++) {
            String[] tokens = bufferedReader.readLine().split(" ");
            int N = Integer.parseInt(tokens[0]);
            int M = Integer.parseInt(tokens[1]);
            long result = calculate(N, M);
            resultArr[i] = result;
        }
        
        for (int i = 0; i < T; i++) {
            System.out.println(resultArr[i]);
        }
        
        bufferedReader.close();
    }
    
    private static long calculate(int N, int M) {
        long result = 1;

        for (long i = M, j = 1; j <= N; i--, j++) {
            result *= i;
            result /= j;
        }

        return result;
    }
}

result 계산 부분도 하나의 for문으로 합칠 수 있었다.