๋งํฌ
https://www.acmicpc.net/problem/1010
๋ฌธ์ ์์ฝ
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ๋ค๋ฆฌ๋ฅผ ์ง์ ์ ์๋ ๊ฒฝ์ฐ์ ์ ์ถ๋ ฅํ๊ธฐ
๊ฐ์ ์์ชฝ์๋ N๊ฐ, ๋์ชฝ์๋ M๊ฐ์ ์ฌ์ดํธ๊ฐ ์๋ค.
๋ค๋ฆฌ๋ผ๋ฆฌ ์๋ก ๊ฒน์น ์ ์๋ค.
์์ชฝ์ ์ฌ์ดํธ ๊ฐ์๋งํผ (N๊ฐ) ๋ค๋ฆฌ๋ฅผ ์ง์ผ๋ ค๊ณ ํ๋ค.
์ ํ
- ์ ๋ ฅ์ ์ฒซ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง
- ๊ทธ๋ค์ ์ค๋ถํฐ ๊ฐ๊ฐ์ ํ
์คํธ์ผ์ด์ค์ ๋ํด ๊ฐ์ ์์ชฝ๊ณผ ๋์ชฝ์ ์๋ ์ฌ์ดํธ์ ๊ฐ์ ์ ์ N, M ์ด ์ฃผ์ด์ง
- 0 < N ≤ M < 30
ํ์ด
๋ณด์๋ฉด ์๊ฐ์ ํ์ด 0.5์ด๋ก ๋งค์ฐ ์งง์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๋ฉฐ ๋ฌธ์ ๋ฅผ ํ๋ฉด ์ ๋ฉ๋๋ค.
N๊ฐ์ ์ฌ์ดํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค๋ฆฌ๋ฅผ ์ง๊ธฐ ๋๋ฌธ์ N ๊ฐ์ด ๋์ผํ ๋ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
`[N=2์ผ ๋]`
M=2: 1
M=3: 3
M=4: 6
M=5: 10
M=6: 15
…
๋ต ๊ฒฐ๊ณผ๊ฐ ์ต์ํ์ง ์์ผ์ ๊ฐ์?
๋ฐ๋ก M๊ฐ์ค N๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ์กฐํฉ ๋ฌธ์ ์ ๋๋ค.
`M=3`, `N=2`๋ผ๊ณ ํฉ์๋ค.
์์ชฝ 1, 2๋ฒ์ ๋์ชฝ 1, 2๋ฒ๊ณผ ์ฐ๊ฒฐํ๋ ๊ฒฝ์ฐ๋ ํ๋์ ๋๋ค. ๋ฐ๋ก 1-1, 2-2๋ก ์ฐ๊ฒฐ๋๋ ๊ฒฝ์ฐ์ ๋๋ค.
๊ฒฐ๊ตญ, ๋์ชฝ์์ N๊ฐ๋ฅผ ์ ํํ์ ๋ ์์ชฝ N๊ฐ์ ์ฌ์ดํธ์ ์ฐ๊ฒฐํ ์ ์๋ ๊ฒฝ์ฐ๋ “ํ๋”์ ๋๋ค.
๋ฐ๋ผ์ ๋์ชฝ M๊ฐ ์ค N๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ์ ์๊ฐ ๋ค๋ฆฌ๋ฅผ ์ง์ ์ ์๋ ๊ฒฝ์ฐ์ ์๊ฐ ๋์ด๋ฒ๋ฆฝ๋๋ค.
์ด๋ ๋ค๋ฆฌ๊ฐ ๊ฒน์น์ง ์์์ผ ํ๋ค๋ ์กฐ๊ฑด ๋๋ฌธ์ ๋๋ค.
๋ง์ฝ ์ด ์กฐ๊ฑด์ด ์๋ค๋ฉด 1-1,2-2 / 1-2, 2-1 ์์ด ๋ฌธ์ ๊ฐ ๋์ด๋ฒ๋ฆฝ๋๋ค.
์กฐํฉ ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด ์ฒ์ ๋ ์ฌ๋ฆด ์ ์๋ ๊ฒ์ด factorial ํจ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํด ์กฐํฉ ๊ณ์ฐํ๋ ๋ฐฉ์์ ๋๋ค.

ํ์ง๋ง M ๊ฐ์ด ์ต๋ 29์ด๊ณ , 29 ํฉํ ๋ฆฌ์ผ์ long์ ๋ฒ์๋ฅผ ๋์ด๊ฐ๊ธฐ ๋๋ฌธ์ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํฉ๋๋ค!
๋ฐ๋ผ์ ์๋ ์กฐํฉ ์ฑ์ง์ ์ด์ฉํด dp๋ก ๋ฌธ์ ๋ฅผ ํ์ด์ผ ํฉ๋๋ค.


์ฝ๋
import java.util.*;
import java.io.*;
public class Main {
static int T, N, M;
static int[][] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
T = Integer.parseInt(br.readLine());
dp = new int[30][30];
for(int i=0; i<T; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
sb.append(sol(M,N)).append("\\n"); // M๊ฐ์ค N๊ฐ์ ์กฐํฉ์ ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ์ ์
}
System.out.print(sb);
}
static int sol(int n, int r){
if(dp[n][r] > 0) // ์ด๋ฏธ ๊ณ์ฐํ ๊ฒฝ์ฐ
return dp[n][r];
if(n == r || r < 1){ // N๊ฐ ์ค N๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ์ ์๋ 1 + 0๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ์ ์๋ ํญ์ 1
return dp[n][r] = 1;
}
return dp[n][r] = sol(n-1, r-1) + sol(n-1, r);
}
}
๐ท ์๊ฐ ๋ณต์ก๋
- ๊ฐ (n, r) ์กฐํฉ์ ํ ๋ฒ์ฉ๋ง ๊ณ์ฐํ๊ณ , ๊ฐ๋ฅํ (n, r) ์กฐํฉ์ ์ต๋ N*M๊ฐ๋ค.
- ์ต์ข ์๊ฐ ๋ณต์ก๋: O(N*M)
๐ท ์คํ ์๋
Time: 104 ms, Memory: 14348 KB
'๐ช Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [BOJ/๋ฐฑ์ค] 2597 ๊ณ๋จ ์ค๋ฅด๊ธฐ(JAVA) (2) | 2025.02.14 |
|---|---|
| [BOJ/๋ฐฑ์ค] 13023 ABCDE(JAVA) (1) | 2025.02.12 |
| [BOJ/๋ฐฑ์ค] 2178 ๋ฏธ๋ก ํ์(JAVA) (1) | 2025.02.11 |
| [BOJ/๋ฐฑ์ค] 1931 ํ์์ค ๋ฐฐ์ (JAVA) (1) | 2025.02.10 |