λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“ μ•Œκ³ λ¦¬μ¦˜/Programmers

[C++/PGS] Lv.3 : N으둜 ν‘œν˜„ (DP)

728x90

https://school.programmers.co.kr/learn/courses/30/lessons/42895

 

문제 μ„€λͺ…

μ•„λž˜μ™€ 같이 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 ν•©λ‹ˆλ‹€.

 

μ–΄λ €μš΄ dp문제... 사싀 dfsλ‘œλ„ ν’€ 수 μžˆμ„ 것 κ°™μ•˜λŠ”λ° λΆ„λ₯˜κ°€ dp길래 dp둜 ν’€λ €κ³  μ΅œμ„ μ„ λ‹€ν–ˆμœΌλ‚˜

μ‹€νŒ¨ν•˜κ³  κ·Έλƒ₯ κ΅¬κΈ€λ§ν•΄λ³΄μ•˜λ‹€

 

근데 μ„€λͺ… 보고도 이해가 μ•ˆλΌμ„œ ν•œμ°Έμ„ λ„μ μ΄λ©΄μ„œ μ΄ν•΄ν•˜λ €κ³  λ…Έλ ₯함. κ·Έλž˜μ„œ ν•œ 80퍼 정도 μ΄ν•΄ν–ˆλ‹€....

 

 

μ•„λ‹ˆ μ˜μ‚¬μ–‘λ°˜

4쀑 for문은 λ„ˆλ¬΄ν•œκ±° μ•„λ‹ˆμ˜€>?

 

 

λ‚˜μ˜ 풀이

#include <string>
#include <vector>
#include <set>
using namespace std;

int solution(int N, int number) {
    int answer = -1;
    set<int> dp[8];
    
    int tmp=0;
    for(int i=0; i<8; ++i){
        tmp = tmp*10 + N;
        dp[i].insert(tmp);
    }
    
    for(int i=1; i<8; ++i){
        for(int j=0; j<i; ++j){
            for(int a : dp[j]){
                for(int b : dp[i-j-1]){
                    dp[i].insert(a+b);
                    dp[i].insert(a-b);
                    dp[i].insert(a*b);
                    if(b>0) dp[i].insert(a/b);
                }
            }
        }
    }
    
    for(int i=0; i<8; ++i){
        if(dp[i].count(number)){
            answer = i+1;
            break;
        }
    }
    
    return answer;
}

 

728x90