알고리즘 풀이

[JAVA]프로그래머스_N으로 표현 (level 3)

Miiko 2021. 9. 9. 01:28

 

[JAVA]프로그래머스_N으로 표현 (level 3)

 

https://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이다.
이처럼 숫자 Nnumber가 주어질 때, N과 사칙연산만 사용해서 표현 할 수 있는 방법 중 N 사용횟수의 최솟값을 return 하도록 solution 함수를 작성하는 문제이다.

 

 

제한사항

  • N은 1 이상 9 이하
  • number는 1 이상 32,000 이하
  • 수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시
  • 최솟값이 8보다 크면 -1을 return

 

입출력 예

N number return
5 12 4
2 11 3

 

입출력 예 설명

예제 #1
문제에 나온 예와 동일

예제 #2
11 = 22 / 2와 같이 2를 3번만 사용하여 표현 가능


프로그래머스에는 dp문제로 분류되어 있다. 하지만 구글링 해보면, DFS로 풀이한 분들도 많다.

나는 number가 N, NN, NNN, NNNN, .. 의 +연산 만으로 가장 작은 횟수를 구할 수 있을 거라고 생각했다. 

그리고 30분 정도 고민하다가 감이 안와서 바로 풀이를 보았다. 풀이를 이해 한 후 직접 다시 코딩해보았다. 

 

 

내가 참고한 풀이는

제약사항의

  • 최솟값이 8보다 크면 -1을 return

를 적극 활용한다.

 

 

Set<Integer> 배열을 8개 만들어서 

각 횟수에 나올 수 있는 모든 결과의 경우의 수(사칙연산을 수행한 모든 결과)를 add 해준다.

(이 부분이 잘 이해가 가지 않아서 좀 더 고민해볼 예정)

 

마지막 부분에서 number값이 있는지 확인하기 위해 for문 수행.

 

 

존재하는 경우

1부터 8까지 돌리면서 결과값이 처음 나오는 index를 반환.

존재하지 않는 경우

-1 반환

 

 

 

[JAVA] 전체 코드

import java.util.HashSet;
import java.util.Set;

class Solution {
    public int solution(int N, int number) {
		int answer = -1;
		int t = N;
		Set<Integer>[] setArr= new Set[9];
		for(int i=1;i<9;i++) {
			setArr[i] = new HashSet<>();
			setArr[i].add(t);
			t = t*10+N;
		}
		
		for(int i=1;i<9;i++) {
			for(int j=1;j<i;j++) {
				for(Integer a : setArr[j]) {
					for(Integer b : setArr[i-j]) {
						setArr[i].add(a+b);
						setArr[i].add(a-b);
						setArr[i].add(b-a);
						setArr[i].add(a*b);
						if(a!=0) {
							setArr[i].add(b/a);
						}
						if(b!=0) {
							setArr[i].add(a/b);
						}

					}
				}
			}
		}
		
		
		for(int i=1;i<9;i++) {
			if(setArr[i].contains(number)) {
				answer = i;
				break;
			}
		}
        
        
        return answer;
    }
}

'알고리즘 풀이' 카테고리의 다른 글

[JAVA]백준 1010번: 다리 놓기  (0) 2021.09.09
[JAVA]백준 5904번: Moo 게임  (0) 2021.08.30