반응형
문제
문제 링크 : 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 |
풀이
도무지 동적 계획법으로는 모르겠어서 그냥 재귀적인 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;
}
}
}
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;
}
}
}
결과
반응형
'알고리즘 > 문제풀이' 카테고리의 다른 글
Longest Increasing Sequence (알고스팟) (LIS) [JAVA] (0) | 2020.12.26 |
---|---|
삼각형 위의 최대 경로 (알고스팟) (TRIANGLEPATH) (0) | 2020.12.26 |
와일드카드 (WILDCARD) (알고스팟) [JAVA] (0) | 2020.12.26 |
회전 초밥 (백준 15961번) (0) | 2020.12.26 |
Gaaaaaaaaaarden(백준 18809번) [JAVA] (0) | 2020.12.26 |
Comment