N과 number가 주어질 때, N과 사칙연산만 사용해서 표현 할 수 있는 방법 중 N 사용횟수의 최솟값을 return. 이때 최소값이 8보다 크면 -1을 return
숫자 i개를 사용했을 때 만들어지는 모든 수를 하나의 통에 담는다.
※ -, /의 경우 (1-2) ≠ (2-1) 이므로 순서를 고려해야 한다.
우선 통을 저장하기 위한 list를 만들고 HashSet(통)을 요소로 저장한다. (List<HashSet<Integer>> list
)
→ list.get(i).add()
하면 i번째 요소에 있는 집합에 값을 저장 가능
→ i번째 통에는 가능한 경우를 사칙연산한 결과와 N을 i번 반복한 값을 저장한다.
※ N을 i번 반복하기 위한 간단한 메서드 repeat(i)
사용
import java.util.*;
class Solution {
public int solution(int N, int number) {
//통 만들기
List<HashSet<Integer>> list = new ArrayList<>();
//8개의 통 만들기
for(int i=0; i<=8; i++) {
list.add(new HashSet<Integer>());
}
//i=1인 경우부터 시작
list.get(1).add(N);
if(number == N) return 1;
//i=2 ~
for(int i=2; i<=8; i++) {
HashSet<Integer> tmp = list.get(i);
//이전 i값에서 현재 i값 만들기
for(int j=1; j<i; j++) {
HashSet<Integer> a = list.get(j);
HashSet<Integer> b = list.get(i-j);
for(int x : a) {
for(int y : b) {
tmp.add(x + y); // 더하기
tmp.add(x - y); // 빼기
tmp.add(x * y); // 곱하기
if(x != 0 && y != 0) tmp.add(x / y); // 나누기
}
}
tmp.add(Integer.parseInt(String.valueOf(N).repeat(i)));
}
// i개의 N으로 number를 만들 수 있다면 끝
if(tmp.contains(number)) return i;
}
// 8개보다 더 많은 숫자가 필요하므로 -1
return -1;
}
}