์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- programmers
- php ํ๋ก๊ทธ๋๋ฐ
- spring
- ํ์ด์ฝ ์ด๋์ฝ๋
- ์ต๋จ ๊ฒฝ๋ก
- C
- ์๋ฐ ์คํ๋ง
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์์
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ๋ฌธ์ ํ์ด
- Java
- SWEA
- C์ธ์ด
- ํ์ด์ฌ
- ํ๋ฌํฐ ๊ฐ๋ฐํ๊ฒฝ ์ค์
- JAVA SPRING
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์ฐ์ต๋ฌธ์
- ์๋ฐ
- php
- ๋ฐฐ์ด
- ํ์ด์ฝ ์ถ์ฒ์ธ
- ํ์ ๋ถ๊ธฐ
- ํ๋ฌํฐ
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์๋ฃจ์
- ํ์ด์ฝ ์ถ์ฒ์ธ์ฝ๋
- Flutter
- ์คํ๋ง
- ํ์ด์ฝ ์น๊ตฌ์ฝ๋
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ 3ํ
- ๋ฐฑ์ค
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ
- Today
- Total
ImJay
[BOJ/Java] 12422. ์ฐฝ๋ฌธ ๊นจ๊ธฐ (Large) ๋ณธ๋ฌธ
๐ [BOJ/Java] 12422. ์ฐฝ๋ฌธ ๊นจ๊ธฐ (Large)
๐ ๋ฌธ์ ๋งํฌ
๐ ๋ฌธ์ ํด์
๋ณธ ๋ฌธ์ ๋ K๊ฐ์ ์ฐฝ๋ฌธ์ผ๋ก ๋๋ฌ์ธ์ธ ๋ฐฉ์์ ์งํ๋๋ ์ํฉ์ ๋ชจ๋ธ๋งํ๋ค. ์ฐฝ๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ํ ๊ฐ์ ๊นจ์ง๋, H๊ฐ์ ์ฐฝ๋ฌธ์ ๊ฐํ๋์ด ์์ด ์ฒซ ๋ฒ์งธ ๋์ ๊ฒฌ๋๊ณ ๋ ๋ฒ์งธ ๋์ ๊นจ์ง๋ค. ๋ชจ์ ์ ์ M๋ช
์ ์ผ๊พผ์ด ๊ฐ๊ฐ ๋ฌด์์๋ก ํ ์ฐฝ๋ฌธ์ ์ ํํ์ฌ ์ถ๊ฐ ๊ฐํ ์์
์ ์ํํ๋ฉฐ, ํ ๋ฒ ๊ฐํํ ๋๋ง๋ค ํด๋น ์ฐฝ๋ฌธ์ ๋์ ํ ๋ฒ ๋ ๋ฒํธ ์ ์๋ค. ๋ชจ์ ๋น์ผ์๋ N๋ช
์ ์
๋น์ด ๊ฐ์ ํ ๊ฐ์ ์ฐฝ๋ฌธ์ ์ ํํ์ฌ ๋์ ๋์ง๋ฉฐ, ์ด๋ฏธ ๊นจ์ง ์ฐฝ๋ฌธ์ ๋์ด ๋์ ธ์ง๋ฉด ๋์ ๊ทธ๋๋ก ํต๊ณผํ๋ค.
๋ฌธ์ ์ ๋ชฉํ๋ ๋ชจ์ ํ์ ์ต์ ํ ๊ฐ ์ด์์ ์ฐฝ๋ฌธ์ด ๊นจ์ง ํ๋ฅ ์ ๊ตฌํ๋ ๊ฒ์ด๋ค.
๐ ๏ธ ํ์ด ๊ณผ์
๋ณธ ๋ฌธ์ ๋ ๊ฐ ์ฐฝ๋ฌธ์ ๋ด๊ตฌ์ฑ์ ๊ฐํ์ ๋ ๋์ง๊ธฐ์ ๊ฒฐ๊ณผ๋ก ๋ชจ๋ธ๋งํ์ฌ, ์ ์ฒด ๋ฐฉ์ด ์์ ํ ์ํ(์ฆ, ํ ๊ฐ์ ์ฐฝ๋ฌธ๋ ๊นจ์ง์ง ์์ ์ํ)๊ฐ ๋ ํ๋ฅ ์ ๊ณ์ฐํ ํ, 1์์ ํด๋น ํ๋ฅ ์ ๋นผ์ด ์ฐฝ๋ฌธ์ด ๊นจ์ง ํ๋ฅ ์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค. ๋ฌธ์ ํด๊ฒฐ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ด ์งํ๋๋ค.
- ์ฐฝ๋ฌธ ๊ทธ๋ฃน ๋ถ๋ฆฌ:
K๊ฐ์ ์ฐฝ๋ฌธ ์ค H๊ฐ๋ ์ฒ์๋ถํฐ ๊ฐํ๋ ์ฐฝ๋ฌธ(๊ทธ๋ฃน A)์ผ๋ก ๊ธฐ๋ณธ ๋ด๊ตฌ์ฑ์ด 2์ด๋ฉฐ, ๋๋จธ์ง K − H๊ฐ๋ ๊ธฐ๋ณธ ์ฐฝ๋ฌธ(๊ทธ๋ฃน B)์ผ๋ก ๊ธฐ๋ณธ ๋ด๊ตฌ์ฑ์ด 1์ด๋ค. - ๋์ ๊ณํ๋ฒ(DP)์ ํตํ ๊ฒฝ์ฐ์ ์ ๊ณ์ฐ:
๊ฐ ์ฐฝ๋ฌธ์ ๋ํด ์ถ๊ฐ ๊ฐํ ํ์(dr)์ ๋์ ๋ง์ ํ์(ds)์ ์กฐํฉ์ผ๋ก ๊ธฐ์ฌ๋๋ฅผ ๊ณ์ฐํ๋ค. ๊ฐ ์ฐฝ๋ฌธ์ ๋ค์์ ์์ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
- ๊ทธ๋ฃน A(๊ฐํ ์ฐฝ๋ฌธ):ds ≤ dr + 1
- ๊ทธ๋ฃน B(๊ธฐ๋ณธ ์ฐฝ๋ฌธ):ds ≤ dr
๊ฐ ์ฐฝ๋ฌธ์ ๋ํด 1/(dr! × ds!)์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ๋ ์์ฑํจ์๋ฅผ ๊ณ ๋ คํ๋ฉฐ, ์ ์ฒด ์ฐฝ๋ฌธ์ ๋ํ ๊ฒฝ์ฐ์ ์๋ ๋ ๊ทธ๋ฃน์ DP ๊ฒฐ๊ณผ๋ฅผ ํฉ์ฑ(convolution)ํ์ฌ ๊ตฌํ๋ค. - ์ต์ข
ํ๋ฅ ๊ณ์ฐ:
๋ชจ์์์ ์ด Mํ์ ๊ฐํ์ Nํ์ ๋ ๋์ง๊ธฐ๊ฐ ์ด๋ฃจ์ด์ง ๋, ์์ ํ ์ํ์ ํ๋ฅP_safe
๋ ์๋์ ๊ฐ์ด ๊ณ์ฐ๋๋ค.P_safe = (M! × N! / K^(M+N)) × S_total
์ฌ๊ธฐ์ S_total์ ์ ์ฒด generating function์์ x^M·y^N ํญ์ ๊ณ์์ด๋ค. ์ต์ข ์ ์ผ๋ก ์ฐฝ๋ฌธ์ด ๊นจ์ง ํ๋ฅ ์1 − P_safe
๋ก ๊ตฌํ๋ค.
๐ป ์ฝ๋ ๊ตฌํ (Java)
import java.io.*;
import java.util.*;
public class Main {
// M๊ณผ N์ ์ต๋๊ฐ์ด 100์์ ๊ณ ๋ คํ์ฌ MAX๋ฅผ 110์ผ๋ก ์ค์ ํ๋ค.
static final int MAX = 110;
public static void main(String[] args) throws Exception {
// ๋น ๋ฅธ ์
์ถ๋ ฅ์ ์ํ์ฌ BufferedReader์ PrintWriter๋ฅผ ์ฌ์ฉํ๋ค.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(System.out);
int T = Integer.parseInt(br.readLine().trim());
// 0๋ถํฐ MAX-1๊น์ง์ ํฉํ ๋ฆฌ์ผ๊ณผ ๋ก๊ทธ ํฉํ ๋ฆฌ์ผ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํ๋ค.
double[] fact = new double[MAX];
double[] logFact = new double[MAX];
fact[0] = 1.0;
logFact[0] = 0.0;
for (int i = 1; i < MAX; i++) {
fact[i] = fact[i - 1] * i;
logFact[i] = logFact[i - 1] + Math.log(i);
}
// 0๋ถํฐ MAX-1๊น์ง์ 1/n! ๊ฐ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํ๋ค.
double[] invFact = new double[MAX];
for (int i = 0; i < MAX; i++) {
invFact[i] = 1.0 / fact[i];
}
// ๊ฐ ํ
์คํธ ์ผ์ด์ค๋ฅผ ์ฒ๋ฆฌํ๋ค.
for (int t = 1; t <= T; t++) {
String line = br.readLine();
String[] parts = line.trim().split("\\s+");
int K = Integer.parseInt(parts[0]); // ์ฐฝ๋ฌธ์ ์ด ๊ฐ์์ด๋ค.
int N = Integer.parseInt(parts[1]); // ๋์ ๋์ง๋ ์
๋น์ ์์ด๋ค.
int M = Integer.parseInt(parts[2]); // ๊ฐํํ๋ ์ผ๊พผ์ ์์ด๋ค.
int H = Integer.parseInt(parts[3]); // ์ฒ์๋ถํฐ ๊ฐํ๋ ์ฐฝ๋ฌธ์ ๊ฐ์์ด๋ค.
// ๊ทธ๋ฃน A๋ ๊ฐํ๋ ์ฐฝ๋ฌธ, ๊ทธ๋ฃน B๋ ๊ธฐ๋ณธ ์ฐฝ๋ฌธ์ด๋ค.
int countA = H;
int countB = K - H;
// ๊ทธ๋ฃน A์ ๋ํ DP ํ
์ด๋ธ์ ๊ตฌ์ฑํ๋ค.
// dpA[r][s]๋ ๊ทธ๋ฃน A์ ์ฐฝ๋ฌธ์ ๋ํด ์ด rํ์ ์ถ๊ฐ ๊ฐํ์ sํ์ ๋ ๋์ง๊ธฐ๊ฐ ์ด๋ฃจ์ด์ก์ ๋์ ๊ธฐ์ฌ๋ ํฉ์ด๋ค.
// ๊ทธ๋ฃน A์ ์์ ์กฐ๊ฑด์ ds ≤ r + 1์ด๋ค.
double[][] dpA = new double[M + 1][N + 1];
dpA[0][0] = 1.0;
for (int i = 0; i < countA; i++) {
double[][] newdp = new double[M + 1][N + 1];
// ํ์ฌ๊น์ง์ ๊ฐํ ํ์(r0)์ ๋ ๋์ง ํ์(s0)์ ๋ํ์ฌ ์ํํ๋ค.
for (int r0 = 0; r0 <= M; r0++) {
for (int s0 = 0; s0 <= N; s0++) {
double cur = dpA[r0][s0];
if (cur == 0.0) continue;
int remR = M - r0; // ๋จ์ ๊ฐํ ํ์์ด๋ค.
int remS = N - s0; // ๋จ์ ๋ ๋์ง๊ธฐ ํ์์ด๋ค.
// ์ ์ฐฝ๋ฌธ์ ๋ํด ๊ฐ๋ฅํ (dr, ds) ์กฐํฉ์ ์๋ํ๋ค.
// ๋จ, ์์ ์กฐ๊ฑด์ ds ≤ dr + 1์ด๋ค.
for (int dr = 0; dr <= remR; dr++) {
int maxDs = Math.min(remS, dr + 1);
for (int ds = 0; ds <= maxDs; ds++) {
// ํ ์ฐฝ๋ฌธ์์์ ๊ธฐ์ฌ๋๋ 1/(dr! × ds!)์ด๋ค.
double add = invFact[dr] * invFact[ds];
newdp[r0 + dr][s0 + ds] += cur * add;
}
}
}
}
dpA = newdp;
}
// ๊ทธ๋ฃน B์ ๋ํ DP ํ
์ด๋ธ์ ๊ตฌ์ฑํ๋ค.
// dpB[r][s]๋ ๊ทธ๋ฃน B์ ์ฐฝ๋ฌธ์ ๋ํด ์ด rํ์ ์ถ๊ฐ ๊ฐํ์ sํ์ ๋ ๋์ง๊ธฐ๊ฐ ์ด๋ฃจ์ด์ก์ ๋์ ๊ธฐ์ฌ๋ ํฉ์ด๋ค.
// ๊ทธ๋ฃน B์ ์์ ์กฐ๊ฑด์ ds ≤ r์ด๋ค.
double[][] dpB = new double[M + 1][N + 1];
dpB[0][0] = 1.0;
for (int i = 0; i < countB; i++) {
double[][] newdp = new double[M + 1][N + 1];
for (int r0 = 0; r0 <= M; r0++) {
for (int s0 = 0; s0 <= N; s0++) {
double cur = dpB[r0][s0];
if (cur == 0.0) continue;
int remR = M - r0;
int remS = N - s0;
// ๊ทธ๋ฃน B์ ๊ฒฝ์ฐ, ๊ฐ๋ฅํ (dr, ds) ์กฐํฉ์ ds ≤ dr๋ฅผ ๋ง์กฑํ๋ค.
for (int dr = 0; dr <= remR; dr++) {
int maxDs = Math.min(remS, dr);
for (int ds = 0; ds <= maxDs; ds++) {
double add = invFact[dr] * invFact[ds];
newdp[r0 + dr][s0 + ds] += cur * add;
}
}
}
}
dpB = newdp;
}
// ๋ ๊ทธ๋ฃน์ DP ๊ฒฐ๊ณผ๋ฅผ ํฉ์ฑํ์ฌ ์ ์ฒด generating function์์ x^M · y^N ํญ์ ๊ณ์ S_total์ ๊ตฌํ๋ค.
double S_total = 0.0;
for (int rA = 0; rA <= M; rA++) {
for (int sA = 0; sA <= N; sA++) {
int rB = M - rA;
int sB = N - sA;
if (rB < 0 || sB < 0) continue;
S_total += dpA[rA][sA] * dpB[rB][sB];
}
}
// ์ ์ฒด ๋ฐฉ์ด ์์ ํ ์ํ(์ฆ, ํ ๊ฐ์ ์ฐฝ๋ฌธ๋ ๊นจ์ง์ง ์์ ์ํ)๊ฐ ๋ ํ๋ฅ P_safe๋ ์๋์ ๊ฐ์ด ๊ณ์ฐ๋๋ค.
// P_safe = (M! × N! / K^(M+N)) × S_total
// ํฐ ์์ ๊ณ์ฐ์ ์ํ์ฌ ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ฐํ๋ค.
double logP_safe;
if (S_total == 0.0) {
logP_safe = Double.NEGATIVE_INFINITY;
} else {
logP_safe = logFact[M] + logFact[N] + Math.log(S_total) - (M + N) * Math.log(K);
}
double P_safe = (logP_safe == Double.NEGATIVE_INFINITY ? 0.0 : Math.exp(logP_safe));
double ans = 1.0 - P_safe;
if (ans < 0) ans = 0.0;
if (ans > 1) ans = 1.0;
out.printf("Case #%d: %.8f%n", t, ans);
}
out.flush();
out.close();
}
}
โฑ๏ธ ์๊ฐ ๋ณต์ก๋ ๋ถ์
๋ณธ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ ์ฐฝ๋ฌธ๋ง๋ค ๊ฐ๋ฅํ ๊ฐํ์ ๋ ๋์ง๊ธฐ ์กฐํฉ์ 2์ฐจ์ ๋์ ๊ณํ๋ฒ(DP)์ ์ฌ์ฉํ์ฌ ๊ณ์ฐํ๋ค. DP ๋ฐฐ์ด์ ํฌ๊ธฐ๋ (M+1)×(N+1)์ด๋ฉฐ, ๋ด๋ถ ๋ฐ๋ณต๋ฌธ์์๋ ๊ฐํ ํ์์ ๋ ๋์ง๊ธฐ ํ์๋ฅผ ๋ชจ๋ ๊ณ ๋ คํ๋ค.
๊ทธ๋ฃน A์ ๊ทธ๋ฃน B์ ์ฐฝ๋ฌธ ์์ ํฉ์ K(์ต๋ 200)๊ฐ์ด๋ฏ๋ก, ์ ์ฒด ์๊ฐ ๋ณต์ก๋๋ ์ ํ ๋ด์์ ์ถฉ๋ถํ ๊ณ์ฐ ๊ฐ๋ฅํ๋ค.
๐ก ๋๋์
๋ณธ ๋ฌธ์ ๋ ๋จ์ํด ๋ณด์ด๋ ์ํฉ์ ์ํ์ ๋ชจ๋ธ๋ง๊ณผ ๋์ ๊ณํ๋ฒ์ ํตํ์ฌ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ ๋ชจ๋ฒ์ ์ธ ์ฌ๋ก์ด๋ค. ๊ฐ ์ฐฝ๋ฌธ์ ๋ด๊ตฌ์ฑ์ ๊ฐํ์ ๋ ๋์ง๊ธฐ์ ์กฐํฉ์ผ๋ก ์ธ๋ถํํ์ฌ ์์ ์กฐ๊ฑด์ ์๋ฐํ๊ฒ ์ ์ํ ์ ์ด ์ธ์์ ์ด๋ค. ๋ํ, ํฐ ์์ ์ฐ์ฐ์์ ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฒํ๋ก์ฐ๋ฅผ ๋ฐฉ์งํ ์ ๊ทผ๋ฒ์ ๊ณ์ฐ์ ์์ ์ฑ์ ๋ณด์ฅํ๋ค. ์ด๋ฌํ ๋ฐฉ๋ฒ๋ก ์ ๋ณต์กํ ์กฐํฉ๋ก ๋ฌธ์ ๋ฅผ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ๋ ๋ฐ ํฐ ๋์์ด ๋๋ค.
'์๊ณ ๋ฆฌ์ฆ > BOJ - Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ/Java] 3628. Knockdown (0) | 2025.03.14 |
---|---|
[BOJ/Java] 6902. Orko (1) | 2025.03.13 |
[BOJ/Java] 5266. Strange Dream (0) | 2025.03.13 |
[BOJ/Java] 11404. ํ๋ก์ด๋ (1) | 2025.03.10 |
[BOJ/Java] 2931. ๊ฐ์ค๊ด (0) | 2025.03.10 |