백준 풀기

백준 2407번: 조합 with Java

삼겹살파튀 2024. 7. 18. 15:13

조합

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 128 MB 34405 13150 11410 42.423%

문제

nCm을 출력한다.

입력

n과 m이 주어진다. (5 ≤ n ≤ 100, 5 ≤ m ≤ 100, m ≤ n)

출력

nCm을 출력한다.

예제 입력 1 복사

100 6

예제 출력 1 복사

1192052400

 

 


 

 

모지 읽을 것도 별루 없구 짱 쉬워 보이잔하ㅏ~~~~~

구냥 nCm 출력이네??? 100C6 이면 (100 * 99 * 98 * 97 * 96 * 95) / (6 * 5 * 4 * 3 * 2 * 1) 아입니까!

 

그렇게 뚝딱 나온 첫 번째 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BJ_2407 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String[] nm = br.readLine().split(" ");
		int n = Integer.parseInt(nm[0]);
		int m = Integer.parseInt(nm[1]);
		
		double result = 1;
		int count = m;
		for (int i = 0; i < count; i++, n--, m--) {
			result = result * n / m;
		}
		
		System.out.println(result);
	}
}

 

근데 안 돌아감ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

계속 안 돌아가서 분모 분자 따로 분리해서 int형으로 했다가 사이즈 때문에 안 되는 것 같아서 long 타입으로 바꿔줬더니 예제로는 돌아갔음

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BJ_2407 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String[] nm = br.readLine().split(" ");
		int n = Integer.parseInt(nm[0]);
		int m = Integer.parseInt(nm[1]);
		
		long nResult = 1;
		int mResult = 1;
		int count = m;
		while (0 < count) {
			nResult *= n;
			mResult *= m;
			n--; m--; count--;
		}
		
		System.out.println(nResult / mResult);
	}
}

 

힝 런타임 에러...

 

이거 쉽게 생각했는데 의외로 오류가 많이 나네ㅎ

 

예전에 확통 때 배웠던.... 100C51은 100C49와 같다를 떠올리며 if문을 넣어줬다

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BJ_2407 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String[] nm = br.readLine().split(" ");
		int n = Integer.parseInt(nm[0]);
		int m = Integer.parseInt(nm[1]);
		
		if (n < m * 2) {
			m = n - m;
		}
		
		long nResult = 1;
		long mResult = 1;
		int count = m;
		while (0 < count) {
			nResult *= n;
			mResult *= m;
			n--; m--; count--;
		}
		
		System.out.println(nResult / mResult);
	}
}

뭐야ㅡㅡ 슬슬 빡치기 시작하는데???

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BJ_2407 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String[] nm = br.readLine().split(" ");
		int n = Integer.parseInt(nm[0]);
		int m = Integer.parseInt(nm[1]);
		
		if (n / 2 < m) {
			m = n - m;
		}
		
		long nResult = 1;
		long mResult = 1;
		int count = m;
		while (0 < count) {
			nResult *= n;
			mResult *= m;
			n--; m--; count--;
		}
		
		System.out.println(nResult / mResult);
	}
}

 

if 조건 바꿨는데도 안 됨 왜 안 되냐고~!!!!

짜증나서 초코하임 먹는 중;; 근데 이거 유통기한 지난 것 같다 언제부터 내 방에 있던 거지? 참 눅눅하네..

 

100 50으로 돌리고 nResult mResult 각각 돌려보니까 오버플로우 나는 듯... long 다음 타입이 뭐임.......

구글링해서 찾았다 BigInteger 이거 써야 한다는데???

 

찾아서 수정...!! m이랑 count도 겹쳐서 지우고 m으로 통일했다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
public class BJ_2407 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String[] nm = br.readLine().split(" ");
		int n = Integer.parseInt(nm[0]);
		int m = Integer.parseInt(nm[1]);
		
		// m이 n의 절반보다 클 때
		if (n / 2 < m) {
			m = n - m;
		}
		
		// 오버플로우 막기 위해 BigInteger로 변수 생성, ONE(1)으로 세팅
		BigInteger nResult = BigInteger.ONE;
		BigInteger mResult = BigInteger.ONE;
		
		// m이 0보다 클 때 반복
		while (0 < m) {
			nResult.multiply(BigInteger.valueOf(n));	// multiply로 곱해줌, valueOf로 BigInteger로 변환해서 곱해줘야함
			mResult.multiply(BigInteger.valueOf(m));
			n--; 
			m--;
		}
		
		System.out.println(nResult.divide(mResult));	// 나누기는 divide
	}
}

 

근데...! 백준에 돌리기 전에 테스트 돌려봤는데 1 나옴 그냥 다 1 나옴ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

이유는 nResult.multiply(BigInteger.valueOf(n)); 이거를 쓰면 여기에 저장되는 게 아니라 그대로 반환된다고 한다..!!!!!

nResult = nResult.multiply(BigInteger.valueOf(n));

이렇게 해줘야 된다 함... 

 

그 부분 수정해서 돌렸구

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String[] nm = br.readLine().split(" ");
		int n = Integer.parseInt(nm[0]);
		int m = Integer.parseInt(nm[1]);
		
		// m이 n의 절반보다 클 때
		if (n / 2 < m) {
			m = n - m;
		}
		
		// 오버플로우 막기 위해 BigInteger로 변수 생성, ONE(1)으로 세팅
		BigInteger nResult = BigInteger.ONE;
		BigInteger mResult = BigInteger.ONE;
		
		// m이 0보다 클 때 반복
		while (0 < m) {
			nResult = nResult.multiply(BigInteger.valueOf(n));	// multiply로 곱해줌, valueOf로 BigInteger로 변환해서 곱해줘야함
			mResult = mResult.multiply(BigInteger.valueOf(m));
			n--; 
			m--;
		}
		
		System.out.println(nResult.divide(mResult));	// 나누기는 divide
	}
}

 

 

 

성공!!!!!!!!

짧다고 얕보면 안 된다

참... 괜히 이 사이에 끼어있는 게 아니었어...........