반응형
문제
효빈이의 비밀 박스에는 조약돌이 N개 들어있다. 조약돌의 색상은 1부터 M까지 중의 하나이다.
비밀 박스에서 조약돌을 랜덤하게 K개 뽑았을 때, 뽑은 조약돌이 모두 같은 색일 확률을 구하는 프로그램을 작성하시오.
풀이
각각의 색깔별로 조약돌을 모두 같은 색을 뽑을확률을 모두 더해주면 답이 된다.
📌 입력
int M = Integer.parseInt(br.readLine());
StringTokenizer st= new StringTokenizer(br.readLine(), " ");
int N = 0;
int[] color = new int[M];
for(int i=0; i<M; i++){
color[i] = Integer.parseInt(st.nextToken());
N += color[i];
}
int K = Integer.parseInt(br.readLine());
각각의 조약돌을 입력받을 때 그 값을 모두 더해서 전체 조약돌의 개수를 구해주어야 한다.
전체 조약돌의 수를 통해 각 색깔별 조약돌을 뽑을 확률을 계산한다.
📌 확률 계산
double answer = 0;
for(int i=0; i<M; i++){
double value = 1;
for(int j=0; j<K; j++){
value *= ((double) (color[i]-j) / (N-j));
}
answer += value;
}
소수점 굉장히 아래까지 계산해야 하기 때문에 double형으로 선언하였고 주의할 점은 나누기 연산에 double 캐스팅을 해주어야 값이 나온다.
- 만약 3개의 조약돌을 꺼내야 하고 색깔이 총 3개가 있다고 가정했을 때 다음과 같이 계산한다.
- 붉은색 조약돌을 3번꺼낼 확률 = 붉은색 조약돌 개수 / 전체 조약돌 개수 * 붉은색 조약돌 개수 -1 / 전체 조약돌 개수 -1 * 붉은색 조약돌 개수 -2 / 전체 조약돌 개수 -2
- 조약돌을 꺼낼때 마다 개수를 갱신해서 계산해야 한다.
- 마지막으로 이렇게 구한 확률을 모두 더해주면 답이 된다.
📌 전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int M = Integer.parseInt(br.readLine());
StringTokenizer st= new StringTokenizer(br.readLine(), " ");
int N = 0;
int[] color = new int[M];
for(int i=0; i<M; i++){
color[i] = Integer.parseInt(st.nextToken());
N += color[i];
}
int K = Integer.parseInt(br.readLine());
double answer = 0;
for(int i=0; i<M; i++){
double value = 1;
for(int j=0; j<K; j++){
value *= ((double) (color[i]-j) / (N-j));
}
answer += value;
}
System.out.println(answer);
}
}
결과
반응형
'백준' 카테고리의 다른 글
[JAVA] 백준 2447 (0) | 2024.03.16 |
---|---|
[JAVA] 백준 16139 구간합 (0) | 2024.03.12 |
[JAVA] 백준 1010 조합+DP (0) | 2024.03.11 |
[JAVA] 백준 2775 DP (0) | 2024.03.11 |
[JAVA] 백준 11051 조합 (0) | 2024.03.11 |