N으로 표현(프로그래머스)

Gritty·2023년 1월 9일
0

프로그래머스 링크

코딩테스트 연습 - N으로 표현

풀이

  • Dynamic Programming에 관한 문제이다, 임시 객체에 무엇을 저장 할 지에 대해 먼저 생각
  • 어떤 부분을 한 번 풀었다면 그 부분에 대한 중복된 계산을 하지 않도록 한다.
  • unordered_set을 통해 정렬되지 않은 키 값에 빠르게 근접하도록 한다.
  • 모든 사칙 연산, NNN… 에 대한 수를 임시 변수에 삽입하여 N[k] = N[i] + N[j]에 관한 계산 진행
  • 만약, number와 같은 숫자가 N[k] 셋에 존재한다면? k - 1 반환, 없다면 -1 반환
#include <string>
#include <vector>
#include <unordered_set>

using namespace std;

int N;
unordered_set<int> cache[10];
unordered_set<int> solve(int n) {
    if (!cache[n].empty()) return cache[n];
    int num = 0;
    for (int i = 0; i < n; i++) num = 10 * num + N;
    unordered_set<int> res;
    res.insert(num);
    for (int i = 1; i < n; i++) {
        int j = n - i;
        auto s1 = solve(i);
        auto s2 = solve(j);
        for (int n1 : s1) 
        {
            for (int n2 : s2) 
            {
                res.insert(n1 + n2);
                if(n1 > n2)
                    res.insert(n1 - n2);
                res.insert(n1 * n2);
                
                if (n1 >= n2) res.insert(n1 / n2);
            }
        }
    }
    return cache[n] = res;
}

int solution(int _N, int number) 
{
    N = _N;
    for (int i = 1; i <= 8; i++) {
        solve(i);
        if (cache[i].find(number) != cache[i].end()) return i;
    }
    return -1;
}
profile
안녕하세요! 게임 클라이언트 개발자에서 서버 개발자로 전환 하고 싶은 Gritty 입니다

0개의 댓글