코테연습

백준 문제 2407번 조합 문제

jackypark 2022. 8. 30. 00:57

백준 문제 

쉬운 문제인줄 알고 시도했던 문제... 하지만 메모리 할당과 컴파일 방법에 많이 실패를 했다... 고로 3번 끝에 문제를 통과했다 ㅠㅠ...

Scanner을 쓰면 메모리를 더 잡아먹고 시간이 더 걸리므로 코테할때는 되도록이면 BufferedReader를 사용한다

 

그리고 이번 조합 문제를 풀때 자료형 크기 때문에 애를 먹었었는데 그걸 해준 것이 바로 BigInteger라는 클래스이다

BigInteger 클래스를 사용하게 되면 int나 long형 범위를 넘어가도 문제를 풀 수 있습니다. 이클래스를 사용하면 무한의 수 까지 표현할 수 있습니다.

 

https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html

 

BigInteger (Java Platform SE 8 )

Immutable arbitrary-precision integers. All operations behave as if BigIntegers were represented in two's-complement notation (like Java's primitive integer types). BigInteger provides analogues to all of Java's primitive integer operators, and all relevan

docs.oracle.com

조합은 수학시간에 푼 공식을 그대로 적용시켰다. nCr = n! / (n-r)! * r!이다

package codetest;

import java.io.BufferedReader; // Scanner와 유사하지만 .Scanner에 비해 입출력 속도가 빠르다
import java.io.IOException; // BufferedReader를 사용하려면 반드시 ioException 예외처리를 해줘야한다
import java.io.InputStreamReader; //bufferedReader를 사용하기위해 임포트함
import java.util.StringTokenizer; //문자열 분리를 위해 임포트함
import java.math.BigInteger; // 무한대 범위 하지만 문자열 형태라고함

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 a = Integer.parseInt(st.nextToken()); //문자열로 받았으니 int형으로 변환
		int b = Integer.parseInt(st.nextToken());//문자열로 받았으니 int형으로 변환
		
        BigInteger n1 = BigInteger.ONE; //1로 변수 초기화
        BigInteger n2 = BigInteger.ONE; //1로 변수 초기화
        
        // nCr = n! / (n-r)! * r! 의 식을 아래 식으로 표현
        for(int i = 0; i<b; i++) { 
            n1 = n1.multiply(new BigInteger(String.valueOf(a-i))); 
            n2 = n2.multiply(new BigInteger(String.valueOf(i+1))); 
        }
        System.out.println(n1.divide(n2));
	}
}

이 코드로 문제를 통과 했다.