[Gold V] 리모컨 - 1107
성능 요약
메모리: 303220 KB, 시간: 1004 ms
분류
브루트포스 알고리즘(bruteforcing)
문제 설명
수빈이는 TV를 보고 있다. 수빈이는 채널을 돌리려고 했지만, 버튼을 너무 세게 누르는 바람에, 일부 숫자 버튼이 고장났다.
리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있다. +를 누르면 현재 보고있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다. 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대 만큼 있다.
수빈이가 지금 이동하려고 하는 채널은 N이다. 어떤 버튼이 고장났는지 주어졌을 때, 채널 N으로 이동하기 위해서 버튼을 최소 몇 번 눌러야하는지 구하는 프로그램을 작성하시오.
수빈이가 지금 보고 있는 채널은 100번이다.
입력
첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼이 주어지며, 같은 버튼이 여러 번 주어지는 경우는 없다.
출력
첫째 줄에 채널 N으로 이동하기 위해 버튼을 최소 몇 번 눌러야 하는지를 출력한다.
풀이
처음에는 N을 기준으로 불가능한 입력일 경우 -1, +1을 해가며 검사하려고 하였는데, 재귀로 구현하니까 오버플로우가 발생하였다.
500,000이면 최대 999,999까지이므로 가능한 수의 조합으로 중복 순열을 만들어서 최소값을 찾아도 시간 제한에 충분할 것 같았다.
가능한 수를 set으로 만들고, N의 자릿수를 구하여 그 자릿수+1까지의 가능한 모든 조합을 확인하고, 가장 작은 값을 ans로 업데이트하였다.
또한 100에서 출발하기 때문에 초기의 ans값은 100-N의 절대값으로 하였다.
package BOJ.Gold.g5;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class BOJ_1107_리모컨 {
static int ans;
static Set<Integer> set;
static int N;
static boolean[] visited;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
int M = sc.nextInt();
set = new HashSet<>();
for (int i = 0; i <= 9; i++)
set.add(i);
for (int i = 0; i < M; i++)
set.remove(sc.nextInt());
// 100에서 누르는게 빠른지
ans = Math.abs(100 - N);
// 가능한 수의 중복순열, ans update
// 자릿수구하기 -> 현재 자릿수 +1까지 가능하게
int tmp = N;
int length = 1;
while (tmp > 0) {
tmp /= 10;
length++;
}
// 처음에 0으로 시작하니까 틀렸다 ㅜㅜ
for (Integer i : set) {
perm(1, length, i);
}
System.out.println(ans);
}
static void perm(int curr, int len, int num) {
ans = Math.min(ans, Math.abs(num - N) + String.valueOf(num).length());
if (curr == len) {
return;
}
for (Integer i : set) {
perm(curr + 1, len, num + i * (int) Math.pow(10, curr));
}
}
}
'문제 풀이 > BOJ' 카테고리의 다른 글
[백준] 7569 - 토마토 (자바 Java) (0) | 2022.12.12 |
---|---|
[백준] 14891 - 톱니바퀴 (자바 Java) (0) | 2022.12.11 |
[백준] 5430 - AC (자바 Java) (1) | 2022.12.04 |
[백준] 3190 - 뱀 (자바 Java) (0) | 2022.12.03 |
[백준] 2343 - 기타 레슨 (자바 Java) (0) | 2022.12.03 |