import java.io.*;
import java.util.StringTokenizer;
public class RemoteController {
static BufferedReader br;
static StringTokenizer st;
static String N;
static int cnt;
static String[] buttons;
static int ans = 0;
public static void main(String[] args) throws IOException{
input();
solve();
System.out.println(ans);
}
public static void input() throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
N = br.readLine();
cnt = Integer.parseInt(br.readLine());
if(cnt > 0) {
st = new StringTokenizer(br.readLine());
buttons = new String[cnt];
for(int i = 0; i < buttons.length; i++) {
buttons[i] = st.nextToken();
}
}
}
public static void solve() {
//예외케이스 1 기본 채널 100일 때
if(Integer.parseInt(N) == 100) return;
//예외케이스 2 버튼 10개가 전부 고장 났을 때
if(cnt == 10) {
ans += Math.abs(Integer.parseInt(N) - 100);
return;
}
//버튼으로 눌렀을 때
int buttonCnt = Math.abs(Integer.parseInt(N) - 100);
//숫자 버튼을 눌렀을 때
int numCnt = calculate(N);
ans = Math.min(buttonCnt, numCnt);
}
public static int calculate(String n) {
int tmpNum = Integer.parseInt(N);
int minusNum = tmpNum - 1;
int plusNum = tmpNum + 1;
if(isValid(tmpNum)) return N.length();
while(true) {
if(minusNum >= 0) {
if(isValid(minusNum)) {
String tmpStrNum = String.valueOf(tmpNum - minusNum);
return Integer.parseInt(tmpStrNum) + String.valueOf(minusNum).length();
}
}
if(isValid(plusNum)) {
String tmpStrNum = String.valueOf(plusNum - tmpNum);
return Integer.parseInt(tmpStrNum) + String.valueOf(plusNum).length();
}
minusNum--;
plusNum++;
}
}
public static boolean isValid(int n) {
String tmp = String.valueOf(n);
if(cnt == 0) return true;
for(int i = 0; i < buttons.length; i++) {
if(tmp.contains(buttons[i])) return false;
}
return true;
}
}
완전탐색 문제이고 예외 케이스 때문에 정답률이 낮은 문제이다.
일단 기본적인 문제 흐름은 두 가지의 경우의 값을 구해서 비교해주면 된다.
1. +,-만을 사용해서 N 채널까지 간 횟수
2. 고장이 나지않은 버튼과 +, - 버튼을 사용해서 N 채널까지 간 횟수
일단 기본적으로 N값이 100일 경우는 움직일 필요가 없기에 예외케이스 1번으로 바로 return 해주었고 두번 째 예외 케이스로 버튼이 전부 다 고장났을 경우에는 +,-만으로 가야하기 때문에 기본채널 100에서 N까지의 거리를 return 해주었다.
이제 1번의 값을 구하는 과정이다.
간단히 N과 100까지의 거리를 구하면 된다.
두번 째로 숫자버튼을 눌러서 최소값을 구하는 경우이다.
문제를 풀고나서 다른 분들의 풀이를 보니 for문으로 숫자를 입력해서 가는 최대범위까지 돌면서 검사했다.
나는 조금 다른 방식으로 문제를 풀었다. N채널 부터 시작해서 두 가지 포인터로 하나는 빼가고 하나는 더해가며 고장난 버튼이 속해있는지 검사해가며 해당 숫자가 고장난 버튼이 없을 경우 해당 값의 길이(숫자버튼 누르는 횟수) 와 N값과 구한 값의 거리를 더해주었다. 그렇게 되면 5 + 5 + 4 + 5 + (+) + (+) = 6으로 값이 나오게 된다.
이렇게 나온 1번의 값과 2번의 값 중 더 작은 값을 출력해주면 답이 나오게 된다.
'Dev > PS' 카테고리의 다른 글
[백준] 10971 외판원 순회 2 java (0) | 2022.03.05 |
---|---|
[백준] 1451 직사각형으로 나누기 java (0) | 2022.03.04 |
[백준] 2661 좋은수열 java (0) | 2022.02.10 |
[백준] 14888 연산자 끼워넣기 java (0) | 2022.02.08 |
[백준] 14889 스타트와 링크 java (0) | 2022.02.08 |