https://www.acmicpc.net/problem/10164
๋ฌธ์
ํ์ ์๊ฐ N์ด๊ณ ์ด์ ์๊ฐ M์ธ ๊ฒฉ์์ ๊ฐ ์นธ์ 1๋ถํฐ N×M๊น์ง์ ๋ฒํธ๊ฐ ์ฒซ ํ๋ถํฐ ์์ํ์ฌ ์ฐจ๋ก๋ก ๋ถ์ฌ๋์ด ์๋ค. ๊ฒฉ์์ ์ด๋ค ์นธ์ โ ํ์๊ฐ ๋์ด ์๋ค. (๋จ, 1๋ฒ ์นธ๊ณผ N × M๋ฒ ์นธ์ โ ํ์๊ฐ ๋์ด ์์ง ์๋ค. ๋ํ, โ ํ์๊ฐ ๋์ด ์๋ ์นธ์ ์ต๋ ํ ๊ฐ์ด๋ค. ์ฆ, โ ํ์๊ฐ ๋ ์นธ์ด ์์ ์๋ ์๋ค.)
ํ์ ์๊ฐ 3์ด๊ณ ์ด์ ์๊ฐ 5์ธ ๊ฒฉ์์์ ๊ฐ ์นธ์ ๋ฒํธ๊ฐ 1๋ถํฐ ์ฐจ๋ก๋๋ก ๋ถ์ฌ๋ ์๊ฐ ์๋์ ์๋ค. ์ด ๊ฒฉ์์์๋ 8๋ฒ ์นธ์ โ ํ์๊ฐ ๋์ด ์๋ค.
๊ฒฉ์์ 1๋ฒ ์นธ์์ ์ถ๋ฐํ ์ด๋ค ๋ก๋ด์ด ์๋์ ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด์ N×M๋ฒ ์นธ์ผ๋ก ๊ฐ๊ณ ์ ํ๋ค.
- ์กฐ๊ฑด 1: ๋ก๋ด์ ํ ๋ฒ์ ์ค๋ฅธ์ชฝ์ ์ธ์ ํ ์นธ ๋๋ ์๋์ ์ธ์ ํ ์นธ์ผ๋ก๋ง ์ด๋ํ ์ ์๋ค. (์ฆ, ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก๋ ์ด๋ํ ์ ์๋ค.)
- ์กฐ๊ฑด 2: ๊ฒฉ์์ โ๋ก ํ์๋ ์นธ์ด ์๋ ๊ฒฝ์ฐ์ ๋ก๋ด์ ๊ทธ ์นธ์ ๋ฐ๋์ ์ง๋๊ฐ์ผ ํ๋ค.
์์์ ๋ณด์ธ ๊ฒ๊ณผ ๊ฐ์ ๊ฒฉ์๊ฐ ์ฃผ์ด์ง ๋, ๋ก๋ด์ด ์ด๋ํ ์ ์๋ ์๋ก ๋ค๋ฅธ ๊ฒฝ๋ก์ ๋ ๊ฐ์ง ์๊ฐ ์๋์ ์๋ค.
- 1 → 2 → 3 → 8 → 9 → 10 → 15
- 1 → 2 → 3 → 8 → 13 → 14 → 15
๊ฒฉ์์ ๊ดํ ์ ๋ณด๊ฐ ์ฃผ์ด์ง ๋ ๋ก๋ด์ด ์์์ ์ค๋ช ํ ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด์ ์ด๋ํ ์ ์๋ ์๋ก ๋ค๋ฅธ ๊ฒฝ๋ก๊ฐ ์ด ๋ช ๊ฐ๋ ๋๋์ง ์ฐพ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ์งธ ์ค์๋ ๊ฒฉ์์ ํ์ ์์ ์ด์ ์๋ฅผ ๋ํ๋ด๋ ๋ ์ ์ N๊ณผ M(1 ≤ N, M ≤ 15), ๊ทธ๋ฆฌ๊ณ โ๋ก ํ์๋ ์นธ์ ๋ฒํธ๋ฅผ ๋ํ๋ด๋ ์ ์ K(K=0 ๋๋ 1 < K < N×M)๊ฐ ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ๊ฐ์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋๋ค. K์ ๊ฐ์ด 0์ธ ๊ฒฝ์ฐ๋ ์๋๋ฐ, ์ด๋ โ๋ก ํ์๋ ์นธ์ด ์์์ ์๋ฏธํ๋ค. N๊ณผ M์ด ๋์์ 1์ธ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
์ฃผ์ด์ง ๊ฒฉ์์ ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ์ค๋ช ํ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์๋ก ๋ค๋ฅธ ๊ฒฝ๋ก์ ์๋ฅผ ๊ณ์ฐํ์ฌ ์ถ๋ ฅํด์ผ ํ๋ค.
ํ์ด
K๋ฒ ์นธ์ ์ง๋๊ฐ๋ ๊ฒฝ์ฐ์ ์๋
์ฒซ๋ฒ์งธ ์นธ์์ k๋ฒ ์นธ๊น์ง ๊ฐ๋ ๊ฒฝ์ฐ์ ์ * k๋ฒ ์นธ์์ ๋ง์ง๋ง ์นธ๊น์ง ๊ฐ๋ ๊ฒฝ์ฐ์ ์
์ด ๋์ ๊ณฑ์ผ๋ก ๋ํ๋ผ ์ ์๋ค.
์คํ๊ต ์ํ๊ณผ์ ์ ์๋ ์ต๋จ ๊ฒฝ๋ก ์ฐพ๊ธฐ ๋ฌธ์ ์ ํ์ ์์ฉํด์
๊ณ ๋ฑํ๊ต ํํต ๊ฒฝ์ฐ์ ์ ๋จ์์ ๋์ค๋ ์ ํ์ด ์๋๋ฐ ๋ฑ ๊ทธ๊ฑฐ๋ค
ํน์ ์นธ๊น์ง ๊ฐ๋ ๊ฒฝ์ฐ์ ์๋ dp๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํ ์ ์๋ค.
int ways(int n, int m) {
vector<vector<int>>dp(n, vector<int>(m,1));
for(int i=1; i<n; i++) {
for(int j=1; j<m; j++) {
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[n-1][m-1];
}
์ด์ k๋ฒ ์นธ์ด ๋ช๋ฒ์งธ ์ค ๋ช๋ฒ์งธ ์นธ์ธ์ง ์์์ผํ๋ค
๊ณ์ฐ์ ํธ์์ฑ์ ์ํด ์นธ์ 0๋ถํฐ ์ฑ์ด๋ค๊ณ ๊ฐ์ ํ์
์๋ฅผ๋ค์ด n=3 m=5์ ๊ฒฝ์ฐ์ ๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฒ์ด๋ค.
0 | 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 |
๊ฐ ์ซ์๋ฅผ m์ผ๋ก ๋๋ ๋ชซ๊ณผ ๋๋จธ์ง๋ฅผ ๊ตฌํด์ {๋ชซ, ๋๋จธ์ง} ํํ๋ก ํํํ๋ฉด
0,0 | 0,1 | 0,2 | 0,3 | 0,4 |
1,0 | 1,1 | 1,2 | 1,3 | 1,4 |
2,0 | 2,1 | 2,2 | 2,3 | 2,4 |
๋ชซ์ ํ-1, ๋๋จธ์ง๋ ์ด-1 ์ ๋ํ๋ด๋ ์ซ์๋ผ๋๊ฑธ ์ ์ ์๋ค
์ฆ, k๋ฒ์ ํด๋นํ๋ ์ขํ๋ฅผ ๊ตฌํ ์ ์๋ค
k--;
int x = k/m + 1;
int y = k%n + 1;
์ฝ๋
// ํ์ด : https://whkakrkr.tistory.com
#include <iostream>
#include <vector>
using namespace std;
const int INF = 100001;
int ways(int n, int m) {
vector<vector<int>>dp(n, vector<int>(m,1));
for(int i=1; i<n; i++) {
for(int j=1; j<m; j++) {
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[n-1][m-1];
}
int solution(int n, int m, int k) {
if(k==0) {
return ways(n,m);
}
k--;
int x = k/m + 1;
int y = k%m + 1;
int to_k = ways(x,y);
int from_k = ways(n-x+1, m-y+1);
return to_k * from_k;
}
int main() {
int n,m,k;
cin >> n >> m >> k;
cout << solution(n,m,k);
return 0;
}
'๐๏ธ ICPC Sinchon > Dynamic Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 1904๋ฒ: 01ํ์ผ (0) | 2024.08.25 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 11722๋ฒ: ๊ฐ์ฅ ๊ธด ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด (0) | 2024.08.19 |
[BOJ][C++] ๋ฐฑ์ค 1699๋ฒ: ์ ๊ณฑ์์ ํฉ (0) | 2024.08.14 |
[BOJ][C++] ๋ฐฑ์ค 8394๋ฒ: ์ ์ (0) | 2024.08.14 |
[BOJ][C++] ๋ฐฑ์ค 2293๋ฒ: ๋์ 1 (0) | 2023.11.24 |