[BOJ 1107] 리모컨 (java)
문제 링크 https://www.acmicpc.net/problem/1107
문제풀이
package basics_500;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ1107 {
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = "";
// 현재 채널
int currentChanel = 100;
// 이동 횟수
int count = 0;
int min = 0;
// 목표 채널
int goalChanel = Integer.parseInt(br.readLine());
// 고장난 버튼의 수
int brokenCount = Integer.parseInt(br.readLine());
// 고장난 버튼 번호
boolean[] brokenNum = new boolean[10];
//고장난 번호가 없을때(brokenCount==0)를 제외해주지 않으면 nullPointerException나옴
if(brokenCount>0) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < brokenCount; i++) {
brokenNum[Integer.parseInt(st.nextToken())] = true;
}
}
// 입력받은 채널이 현재 채널과 같다면 움직일 필요 없음
if (currentChanel == goalChanel) {
System.out.println(0);
return;
}
// 입력받은 채널이 현재 채널과 다를때
/*
* 1. +,- 만 사용하기
* 2. 숫자로만 이동
* 3. 고장 안난 버튼이랑 +,- 전부 사용
*/
// +, -만 사용하면 절대값을 계산하면 됨
min = Math.abs(goalChanel - currentChanel);
//0부터 9를 사용하여 나타날 수 있는 채널의 수
for (int j = 0; j <= 999999; j++) {
str = String.valueOf(j);
boolean isBroken = false;
for (int k = 0; k < str.length(); k++) {
//숫자중에서 고장난 버튼이 하나라도 있으면 탐색할 필요 없음
if(brokenNum[str.charAt(k)-'0']) {
isBroken = true;
break;
}
}
//고장난 버튼이 없다면 해당 숫자의 길이와(str.length())+ 목표채널과의 차(+,-)로 조합 가능함
if(!isBroken) {
count = Math.abs(goalChanel - j) + str.length();
min = count > min ? min : count;
}
}
System.out.println(min);
}
}
Comments