728x90
1. 문제 설명
더보기
아래와 같이 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 함수를 작성하세요.
2. 제한사항
더보기
- N은 1 이상 9 이하입니다.
- number는 1 이상 32,000 이하입니다.
- 수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시합니다.
- 최솟값이 8보다 크면 -1을 return 합니다.
3. 입출력예
N | number | return |
5 | 12 | 4 |
2 | 11 | 3 |
4. 풀이
Solution 1 : 동적 계획법
1. 숫자 N의 갯수별로 만들수 있는 list를 8개 만든다. (최솟값이 8보다 크면 -1 리턴)
2. 숫자 N에 대하여, 갯수 별로 만들 수 있는 수를 넣어준다. ( 3자리 부터는 앞에서 사용했던 조합을 사용한다. 이것이 동적계획법!)
( N=5, 1자리 : 5, 2자리 : 5+5, 5-5, 5*5, 5/5, 3자리 : 1자리조합 + 2자리조합, 1자리 - 2자리, 1자리 * 2자리, 1자리 / 2자리 ...)
3. 중복 된 값이 들어가지 않도록 list에 set 형태로 값을 넣어준다.
4. 각 list마다 연속된 숫자를 잊지 말고 넣어준다. (2자리 : 55)
5. 갯수 별로 계산한 값이 target number와 같은 값이면 return 갯수 를 해준다.
import java.util.*;
class Solution {
public int solution(int N, int number) {
List<Set<Integer>> list = new ArrayList<>();
for(int i=0; i<9; i++){
list.add(new HashSet<>());
}
list.get(1).add(N);
if(number == N) return 1;
for(int i=2; i<9; i++){
for(int j=1; j<=i/2; j++){
numberParse(list.get(i), list.get(i-j), list.get(j));
numberParse(list.get(i), list.get(j), list.get(i-j));
}
String str = String.valueOf(N);
list.get(i).add(Integer.parseInt(str.repeat(i)));
for(Integer n : list.get(i)){
if(n == number){
return i;
}
}
}
return -1;
}
public void numberParse(Set<Integer> unionSet, Set<Integer> fibo1, Set<Integer> fibo2){
for(Integer f1 : fibo1){
for(Integer f2 : fibo2){
unionSet.add(f1+f2);
unionSet.add(f1-f2);
unionSet.add(f1*f2);
if(f2!=0) unionSet.add(f1/f2);
}
}
}
}
5. 풀이 설명
ppt로 설명 (그림 글)
6. 결과
Solution 1
반응형
'공부 > 알고리즘' 카테고리의 다른 글
[프로그래머스] 수식최대화 (0) | 2022.07.08 |
---|---|
[프로그래머스] 가장 큰 수 (0) | 2022.06.25 |
[프로그래머스] 추석 트래픽 (0) | 2022.06.19 |
[프로그래머스] 3진법 뒤집기 (0) | 2022.06.16 |
[프로그래머스] 완주하지 못한 선수 (0) | 2022.06.15 |
댓글