초보 개발자의 이야기, 릿허브

[C++] 백준 1359번 복권 본문

코딩테스트/📗 백준 (BOJ)

[C++] 백준 1359번 복권

릿99 2022. 7. 6. 22:30
728x90
반응형
1. 문제이해

1359번: 복권 (acmicpc.net)

 

1359번: 복권

첫째 줄에 세 정수 N, M, K가 주어진다.

www.acmicpc.net

 

다음과 같은 룰의 복권이 있을 때, 지민이가 복권에 당첨될 확률을 구하는 것이 목표이다.

“1부터 N까지의 수 중에 서로 다른 M개의 수를 골라보세요.

저희도 1부터 N까지의 수 중에 서로 다른 M개의 수를 고를건데, 적어도 K개의 수가 같으면 당첨입니다!”

 

 

 

2. 문제풀이

 

지민이가 1부터 N까지의 수 중에 서로 다른 M개의 수를 골랐을 때,

복권과 적어도 K개의 수가 같으면 당첨이다.

조합, 확률 관련 문제로 고등학교 문제 푸는 것과 비슷한 느낌을 받았다.풀이 방법은 아래 그림과 같다.

 

 

문제의 예제 입력 4에 대한 풀이 예시이다.위 풀이방법을 일반화해보면 다음과 같은 순서로 정의된다.

 

1. 1 ~ N까지의 수 중 M개를 선택할 경우의 수 구하기 (분모)

2. 적어도 N개 이상이 같을 확률을 차례로 구하고 더하기 (분자)

3. 각 분모와 분자에 해당하는 수를 이용해 확률 계산

 

이를 코드에 적용해보면 아래와 같다.

 

 

 

3. 소스코드
#include <iostream>
using namespace std;

// 팩토리얼 구하는 함수
int fac(int num) {
	if (num <= 1) {
		return 1;
	}
	else {
		return num * fac(num - 1);
	}
}

int main() {
	int N;		// 1부터 N까지의 수 중 
	int M;		// 서로 다른 M개의 수를 채택	
	int K;		// 적어도 K개가 같으면 당첨		

	int denominator;	// N개 중 M개를 선택할 경우의 수 (분모)
	int numerator;		// 적어도 K개가 같을 경우의 수 (분자)
	double result;

	cin >> N >> M >> K;

	denominator = fac(N) / (fac(M) * fac(N - M));
	numerator = 0;

	for (int i = K; i <= M; i++) {
    		// 지민이와 복권 숫자가 같은 것에서 뽑을 경우의 수 
		int jimin = fac(M) / (fac(i) * fac(M - i));
        	// 지민이와 복권 숫자가 다른 것에서 뽑을 경우의 수 
		int lotto = fac(N - M) / (fac(M - i) * fac(N - M - M + i));
		numerator += jimin * lotto;
	}

	result = double(numerator) / double(denominator);
	cout.precision(10);
	cout << result;

	return 0;
}

먼저, 확률을 구하기에 앞서, 조합을 이용해 풀었기 때문에

위와 같은 팩토리얼 함수를 재귀를 이용해 구현했다.

 

메인 함수에서는 N, M을 입력받고, 2. 문제풀이에서 이야기한 분모와 분자에 해당하는 값을 구했다.

여기서, 분자에 해당하는 적어도 N개 이상이 같을 경우의 수는 

for문을 이용해 값을 조정해나가며 구해주었다.

마지막 확률을 출력할 때에는 cout.precision(10)을 이용해 10^-9 까지 출력하도록 했다.

(해당 구문을 쓰지 않고 출력하면 조건 불만족으로 오답이 된다.)

 

 


기나긴 졸업 프로젝트를 마치고 돌아왔습니다.😭

그리고 다음주에는.. 바로 연구생으로 들어갈 예정입니다..😱

이래저래 바쁠테지만, 학기중보다는 더 많이 틈틈히 포스팅하고,

포스팅하지 못하더라도 1일 1문제라도 풀이하려고 노력중입니다.🥰

 

졸업 프로젝트에 대한 개념 포스팅도 하고 싶은데,

아직 깃허브도 정리해서 올리지 못한 상태라, 찬찬히 올리도록 하겠습니다..

연구실에서 연구할 분야도 비슷한 딥러닝 분야라,

개인적으로 많이 배우고 나오고 싶네요..

연구실을 나올때는 한층 더 진화한 코린이가 되어있기를 빌면서..^^

다들 더위 조심하세용🥵

 

 

 

 

 

728x90
반응형

'코딩테스트 > 📗 백준 (BOJ)' 카테고리의 다른 글

[C++] 백준 10825번 국영수  (0) 2022.08.09
[C++] 백준 2108번 통계학  (0) 2022.08.09
[C++] 백준 9625번 BABBA  (0) 2022.04.01
[C++] 백준 2292번 벌집  (0) 2022.03.09
[C++] 백준 1302번 베스트셀러  (0) 2022.03.07