N으로 표현 (프로그래머스) [JAVA]
반응형

 

문제

문제 링크 : programmers.co.kr/learn/courses/30/lessons/42895

 

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

 

programmers.co.kr

문제 설명

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

 

풀이

도무지 동적 계획법으로는 모르겠어서 그냥 재귀적인 DFS 탐색으로 풀었다.

ans가 8보다 클때 return 하고, 정답이면 크기를 비교해서 answer를 정한다.

매 i번마다 for문을 돌리는데, 숫자를 사용할 수 있는 것이 최대 8번이므로 8-현재까지 사용한 수 만큼 for문을 돌린다.

현재 값에서 10곱하고 N더한 만큼 (3->33) 늘려주며 재귀를 호출하는 for문을 돌린다.

 

코드

public class Main {
    public static StringBuilder sb = new StringBuilder();
    public static java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));

    static int N;
    static int number;
    static int answer = -1;
    
    public static void main(String[] args)throws Exception {
    	 N = Integer.parseInt(br.readLine());
    	 number = Integer.parseInt(br.readLine());
    	 solution(0,0);
    	 System.out.println(answer);
    }
    static void solution(int temp_ans, int prev) {
        int temp_num = N;
        if (temp_ans > 8) {
            answer = -1;
            return;
        }
        
        if (number == prev) {
            if (answer != -1) {
            	answer = Math.min(temp_ans, answer);
            }
            else {
            	answer = temp_ans;
            }
            return;
        }       
         //8개 넘으면 안됨
        for (int i = 0; i < 8-temp_ans; i++) {
            solution(temp_ans+i+1, prev-temp_num);
            solution(temp_ans+i+1, prev+temp_num);
            if(prev != 0) {
                solution(temp_ans+i+1, prev*temp_num);
                solution(temp_ans+i+1, prev/temp_num);
            }    
            //22->222만들고 다시돌리기
            temp_num =  temp_num*10 + N;
        }
    }
}

 

결과

 

반응형