[JAVA]프로그래머스_N으로 표현 (level 3)
https://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
입출력 예
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 |