📍 문제 설명
💡 접근
누를 수 있는 버튼 중 거리가 최소가 되는 지점을 찾으려면 완전 탐색을 하는 수 밖에는 없었다.
이동하려는 채널은 500000이하지만 9를 제외한 모든 버튼이 고장났을 수도 있으므로 999999에서 이동하는 횟수도 고려해야 했다.
1.0~999999까지 버튼을 눌러야 하는 횟수를 구한다. 횟수 중 최솟값을 계속 누적해나간다.
- 더해야하는 연산자의 갯수는 눌러야하는 번호의 갯수 - 현재 숫자의 갯수이다.
- (5457-5455) = 2 -> 5455++, (5457-5459) = -2 -> 5455--
2.누르지 못하는 번호라면 다음 숫자로 넘어간다.
👩💻 코드
import java.util.*;
public class Main {
static int n, m, answer, cnt, min;
static String a, t;
static char[][] board,clone;
static boolean[] arr;
static boolean[][] visited;
static int[] breakdown;
static int[] dx = {-1, 0, 1, 0,}; //북동남서
static int[] dy = {0, 1, 0, -1};
public static void main(String[] args) {
Main T = new Main();
Scanner kb = new Scanner(System.in);
n = kb.nextInt(); //눌러야하는 번호
m = kb.nextInt(); //고장난 번호의 갯수
arr = new boolean[10]; //고장난 번호
for(int i = 0; i < m; i++) arr[kb.nextInt()] = true;
T.solution();
System.out.println(answer);
}
private void solution() {
//초기채널 설정
answer = Math.abs(n - 100);
if(answer == 0) return;
//0부터 999999까지 최소 버튼 횟수 구하기
for(int i = 0; i < 1000000; i++) {
String s = String.valueOf(i);
//고장난 버튼 확인 변수
boolean flag = true;
for(int j = 0; j < s.length(); j++) {
//고장난 버튼이 포함되어 있으면 해당 번호 못 누른다.
if(arr[s.charAt(j) - '0']) {
flag = false;
break;
}
}
//누를 수 있는 버튼이면 그때 계산
//n - i는 '+'나 '-' 연산자가 필요한 횟수, s.length()는 현재 숫자의 버튼 갯수
if(flag) answer = Math.min(Math.abs(n - i) + s.length(), answer);
}
}
}