πŸ’­ Problem Solving/C++

[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;
}