코테연습
백준 문제 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));
}
}
이 코드로 문제를 통과 했다.