실패
일단 엄청 이상하게 접근했다.
첫번째 이상한 접근
처음에 저 채널이랑 같은 숫자 만드려고 10씩 곱하면서 더함 굳이 그럴 필요없다 그냥 저 숫자가 눌리기만 하면되는 거였다.
두번째 이상한 접근
저 채널을 만들 수 있는 최소의 수를 만드려고 노력했다.
코드에 if문, else if문 엄청 많아 졌다.
마지막에 최소의 수+(찾고자 하는 채널-최소의 수) = 최소의 수+ (+나 -한 회수) = 리모컨 누른 횟수
이렇게 접근해서 하나씩 앞뒤로 누를 수 있는 방안을 생각해야 했다.
이 문제는 완전 탐색 문제였다.
그냥 다 탐색하는 것
풀이는 아래와 같다.
<내가 저 수를 만들 때 모든 번호가 다 고장나서 +와 -로 저 채널에 접근한다는 가정 아래에 있는 수>
그냥 0번부터 999,999번까지(최소가 500,000이지만 0번부터 8까지 고장난 경우 최대 채널) 다 눌러본다. 그 번호 중에서 내가 가지고 있는 리모콘 번호로 만들 수 있는 번호가 나온다.
이 번호에서 나는 이제 +나 -를 통해서 채널에 도달해야 한다.
따라서 총 누른 횟수 = 내가 누른 번호의 길이 - (내가 누른 번호 - 원하는 채널)의 절대값
이 값을 min에 저장하고 나올 때마다 이 값과 비교해서 최솟값을 찾아가는 것이다.
그리고 마지막에 <내가 저 수를 만들 때 모든 번호가 다 고장나서 +와 -로 저 채널에 접근한다는 가정 아래에 있는 수> 와 min을 비교해서 더 작은 값이 정답이다!
한가지 더 M이 0이 아닌 경우에만 고장난 리모컨의 채널을 받는 것!
StringTokenizer st =new StringTokenizer(br.readLine()," ");
boolean[] brk = new boolean[10];
for(int i=0;i<M;i++){
brk[Integer.parseInt(st.nextToken())] = true;
}
위와 같이 선언하면
Nullpointer로 런타임 에러가 발생한다.
따라서 M이 0인 경우에는 아예 문장을 받지 않도록 해야한다.
boolean[] brk = new boolean[10];
if(M!=0) {
String brk_line = br.readLine();
StringTokenizer st = new StringTokenizer(brk_line, " ");
for (int i = 0; i < M; i++) {
brk[Integer.parseInt(st.nextToken())] = true;
}
}
위와 같이 선언해주자
전체 풀이는 아래와 같다.
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw =new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
boolean[] brk = new boolean[10];
if(M!=0) {
String brk_line = br.readLine();
StringTokenizer st = new StringTokenizer(brk_line, " ");
for (int i = 0; i < M; i++) {
brk[Integer.parseInt(st.nextToken())] = true;
}
}
// StringTokenizer st =new StringTokenizer(br.readLine()," ");
//boolean[] brk = new boolean[10];
//for(int i=0;i<M;i++){
// brk[Integer.parseInt(st.nextToken())] = true;
// }
int max = Math.abs(N-100); // 100번부터 +,-만 눌러서 도달
int cnt =0;
int min = Integer.MAX_VALUE;
for(int i=0;i<=999999;i++){
String chan = Integer.toString(i);
boolean tag = true;
for(int j=0;j<chan.length();j++) { // 누른 채널이 리모콘으로 만들 수 있는지 확인
int a = chan.charAt(j) - '0';
if (brk[a]) { // 하나라도 누를 수 없으면 만들 없는 채널
tag = false;
break;
}//if
}//for
if(tag==false) continue; // 못 만들어서 다시 for문
else{
cnt = chan.length() + Math.abs(i-N);
if(cnt<min) min=cnt;
}
}//for
if(max>min) bw.write(Integer.toString(min));
else bw.write(Integer.toString(max));
bw.flush();
bw.close();
br.close();
}
}