๐Ÿ’ญ Problem Solving

[BOJ][C++] ๋ฐฑ์ค€ 9184๋ฒˆ: ์‹ ๋‚˜๋Š” ํ•จ์ˆ˜ ์‹คํ–‰

0=2. 2024. 5. 12. 17:10

๋ฌธ์ œ

https://www.acmicpc.net/problem/9184

ํ’€์ด

๋ฌธ์ œ์— ๋‚˜์™€์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

int w(int a, int b, int c) {
    if (a <= 0 || b <= 0 || c <= 0)
        return 1;
    else if (a > 20 || b > 20 || c > 20)
        return w(20, 20, 20);
    else if (a < b && b < c)
        return w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c);
    else
        return w(a-1, b, c) + w(a-1, b-1, c)
                + w(a-1, b, c-1) - w(a-1, b-1, c-1);
}

 

์žฌ๊ท€์˜ ํšŸ์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด w์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ dp ๋ฐฐ์—ด์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. a, b, c์˜ ๊ฐ’์— ๋”ฐ๋ฅธ ๊ฒฐ๊ณผ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ 3์ฐจ์› dp ๋ฐฐ์—ด์„ ์„ ์–ธํ•œ๋‹ค.
  2. w(a, b, c) ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๋ฐฐ์—ด์— ์ด๋ฏธ ์ €์žฅ๋œ ๊ฐ’์ด๋ฉด, ์žฌ๊ท€ ๊ณผ์ •์„ ์ƒ๋žตํ•˜๊ณ  ๊ทธ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
  3. ๋ฐฐ์—ด์— ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ์ธ๋ฑ์Šค์— ์Œ์ˆ˜ ๋˜๋Š” 20 ์ด์ƒ์˜ ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋„๋ก ์œ ์˜ํ•œ๋‹ค.

์ฝ”๋“œ

#include <iostream>
#include <vector>

using namespace std;

vector<vector<vector<int>>> dp;

int w(int a, int b, int c) {
    if (a <= 0 || b <= 0 || c <= 0) {   // ์ธ๋ฑ์Šค์— ์Œ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†์Œ
        return 1;
    } else if (a > 20 || b > 20 || c > 20) {    // ์ธ๋ฑ์Šค์— 21 ์ด์ƒ์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†์Œ
        return w(20, 20, 20);
    } else if (dp[a][b][c]) { // ๊ฐ’์ด ์กด์žฌํ•˜๋ฉด ์•„๋ž˜ ์žฌ๊ท€ ์ƒ๋žต
        return dp[a][b][c];
    } else if (a < b && b < c) {
        dp[a][b][c] = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);
    } else {
        dp[a][b][c] = w(a - 1, b, c) + w(a - 1, b - 1, c)
                      + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1);
    }

    return dp[a][b][c];
}

int main() {
    int a, b, c;
    dp.assign(21, vector<vector<int>>(21, vector<int>(21, 0)));

    while (true) {
        cin >> a >> b >> c;
        if (a == -1 && b == -1 && c == -1)
            break;
        cout << "w(" << a << ", " << b << ", " << c << ") = " << w(a, b, c) << '\n';
    }

    return 0;
}