๐Ÿ•๏ธ ICPC Sinchon/Dynamic Programming

[BOJ][C++] ๋ฐฑ์ค€ 10164๋ฒˆ: ๊ฒฉ์ž์ƒ์˜ ๊ฒฝ๋กœ

์„ ๋‹ฌ 2024. 8. 15. 02:53
๋ฐ˜์‘ํ˜•

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 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;
}
๋ฐ˜์‘ํ˜•