𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] N으둜 ν‘œν˜„ - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] N으둜 ν‘œν˜„ - C++

.23 2024. 4. 11. 13:03
문제

μ•„λž˜μ™€ 같이 5와 μ‚¬μΉ™μ—°μ‚°λ§ŒμœΌλ‘œ 12λ₯Ό ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

12 = 5 + 5 + (5 / 5) + (5 / 5)
12 = 55 / 5 + 5 / 5
12 = (55 + 5) / 5

5λ₯Ό μ‚¬μš©ν•œ νšŸμˆ˜λŠ” 각각 6,5,4 μž…λ‹ˆλ‹€. 그리고 이쀑 κ°€μž₯ μž‘μ€ κ²½μš°λŠ” 4μž…λ‹ˆλ‹€.
이처럼 숫자 Nκ³Ό numberκ°€ μ£Όμ–΄μ§ˆ λ•Œ, Nκ³Ό μ‚¬μΉ™μ—°μ‚°λ§Œ μ‚¬μš©ν•΄μ„œ ν‘œν˜„ ν•  수 μžˆλŠ” 방법 쀑 N μ‚¬μš©νšŸμˆ˜μ˜ μ΅œμ†Ÿκ°’μ„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜μ„Έμš”.

 

μ œν•œμ‚¬ν•­
  • N은 1 이상 9 μ΄ν•˜μž…λ‹ˆλ‹€.
  • numberλŠ” 1 이상 32,000 μ΄ν•˜μž…λ‹ˆλ‹€.
  • μˆ˜μ‹μ—λŠ” κ΄„ν˜Έμ™€ μ‚¬μΉ™μ—°μ‚°λ§Œ κ°€λŠ₯ν•˜λ©° λ‚˜λˆ„κΈ° μ—°μ‚°μ—μ„œ λ‚˜λ¨Έμ§€λŠ” λ¬΄μ‹œν•©λ‹ˆλ‹€.
  • μ΅œμ†Ÿκ°’μ΄ 8보닀 크면 -1을 return ν•©λ‹ˆλ‹€.
μž…μΆœλ ₯ 예
N number return
5 12 4
2 11 3

 


DPλ₯Ό μ‚¬μš©ν•œ 문제

 

πŸ”— μ°Έκ³  : N으둜 ν‘œν˜„

 

문제λ₯Ό μ–΄λ–»κ²Œ μͺΌκ°œμ•Ό 할지 λͺ°λΌμ„œ 접근도 λͺ»ν•˜κ³  μžˆλ‹€κ°€ 힌트λ₯Ό μ–»κ³  ν’€μ—ˆλ‹€.

 

N의 μ‚¬μš© 횟수λ₯Ό 보면

N = 1μΌλ•Œ DP[1] = 1

N = 2μΌλ•Œ DP[1]을 가지고 사칙연산을 μˆ˜ν–‰(N + N, N - N, N * N, N / N)ν•˜λŠ” 4가지에 두 수λ₯Ό 연달아 뢙인 NNκΉŒμ§€ ν¬ν•¨ν•˜μ—¬ DP[2] = 5

N = 3μΌλ•Œ DP[1]κ³Ό DP[2]둜 사칙연산을 μˆ˜ν–‰ν•˜λŠ” 경우의 수, DP[2]와 DP[1]둜 사칙연산을 μˆ˜ν–‰ν•˜λŠ” 경우의 수, NNN

...

μ΄λŸ°μ‹μœΌλ‘œ

 

νšŸμˆ˜κ°€ i번일 λ•Œμ˜ 경우의 μˆ˜λŠ” DP[1] & DP[i - 1], DP[2] & DP[i - 2], ... , DP[i - 1] & DP[i] μ™€μ˜ 사칙연산을 μˆ˜ν–‰ν•˜μ˜€μ„ λ•Œμ˜ 경우의 μˆ˜μ— N을 i번 μ‚¬μš©ν•œ 경우λ₯Ό λ”ν•˜λ©΄ κ·œμΉ™μ„ 찾을 수 μžˆλ‹€.

 

μ½”λ“œ
#include <string>
#include <vector>
#include <cmath>

using namespace std;

int solution(int N, int number) {
    if(N == number) return 1;

    vector<vector<int>> dp;
    dp.push_back({ 0 });
    dp.push_back({ N });
    
    for(int i = 2; i <= 8; i++) {
        vector<int> temp;

        int k = 0, calc = 0;
        while(k != i) {
            calc += N * (int)pow(10, k++);
        }
        temp.push_back(calc);

        for(int j = 1; j < i; j++) {
            for(int l = 0; l < dp[j].size(); l++) {
                for(int m = 0; m < dp[i - j].size(); m++) {
                    if(dp[i - j][m] == 0) continue;
                    temp.push_back(dp[j][l] + dp[i - j][m]);
                    temp.push_back(dp[j][l] - dp[i - j][m]);
                    temp.push_back(dp[j][l] * dp[i - j][m]);
                    temp.push_back(dp[j][l] / dp[i - j][m]);
                }
            }
        }

        for(int j = 0; j < temp.size(); j++) {
            if(temp[j] == number) return i;
        }

        dp.push_back(temp);
    }

    return -1;
}
Comments