ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] N으로 표현 c++
    Coding Test/programmers 2023. 3. 16. 08:46
    728x90

    문제 설명

    아래와 같이 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

    풀이

    N의 개수에 따라 조합의 경우의 수가 증가합니다.

    N 1개 : N  (1조합)
    
    N 2개 : NN, N+N, N-N, N*N, N/N ( NN 1개와 N+-*/N  4개 총 5조합, 즉 이전 조합에 4개씩  증가됩니다. 
    	 (1+1*4 = 5조합)
    N 3개 : NNN, (NN+N), (NN-N), (NN*N), (NN/N), (N-N) ...
    	(1+5*4 = 21조합)
    N 4개 : NNNN, (NNN+N), (NNN-N), (NNN*N),(NNN.N) ... 
    	(1+21*4 = 85조합)
    .
    .
    .

    조합되는 숫자 중에서 number가 있는지 확인하고 연산 횟수를 반환합니다. 

    N이 최소로 사용된 값이어야 합니다.

    #include <string>
    #include <vector>
    #include <unordered_set>
    
    using namespace std;
    
    int solution(int N, int number) {
        int answer = -1;
        unordered_set<int> s[8];
        int sum = 0;
        for(int i = 0; i < 8; i++){
            sum = 10 * sum + N;		//N, NN, NNN, NNNN....조합을 만든다.
            s[i].insert(sum);
        }
        
        for(int i = 1; i < 8; ++i){
            for(int j = 0; j < i; ++j){
                for(int a : s[j]){
                    for(int b : s[i-j-1]){	//이전 조합들을 가지고 각각 새로운 조합 생성
                        s[i].insert(a+b);
                        s[i].insert(a-b);
                        s[i].insert(a*b);
                        if( b != 0){
                            s[i].insert(a/b);
                        }
                    }
                }
            }
        }
        
        for(int i = 0; i < 8; ++i){	//N 1개 사용부터 검사
            if(s[i].find(number) != s[i].end()){
                answer = i + 1;
                break;
            }
        }   
        return answer;
    }
    728x90

    댓글

© 2022. code-space ALL RIGHTS RESERVED.