이번에 풀어본 문제는
백준 1107번 리모컨 입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int channel = Integer.parseInt(br.readLine());
int n = Integer.parseInt(br.readLine());
boolean [] broken = new boolean[10];
if(n > 0)
{
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i < n; ++i) broken[Integer.parseInt(st.nextToken())] = true;
}
int answer = Math.abs(channel-100);
next : for(int i = 0; i < 1000000; ++i)
{
String cur = i+"";
int len = cur.length();
for(int j = 0; j < len; ++j)
{
if(broken[cur.charAt(j)-'0']) continue next;
}
answer = Math.min(answer,len + Math.abs(channel-i));
}
System.out.print(answer);
}
}
고장난 버튼이 N개 존재할 때, 입력받은 채널로 이동하기 위한 가장 최소 횟수를 구하는 문제입니다. 버튼은 숫자와 +,-가 있으며 숫자는 있는 그대로 해당 숫자채널로, +-는 1씩 증감하는 버튼입니다.
먼저 고장난 숫자버튼을 담아두기 위한 boolean 타입의 broken배열을 만들고, 고장난 번호만 true로 바꿔둡니다.
입력될 수 있는 채널의 최댓값이 500000 이므로, 숫자로 누를 수 있는 최댓값인 999999까지 반복을 진행해줍니다.
i값이 이동할 채널의 번호를 의미하며 i를 숫자로 이동하는 과정에서 고장난 번호가 있다면 확인해 볼 필요가 없기 때문에 다음 반복으로 넘겨줍니다. 고장난 번호가 없는 i값의 경우, i 채널로 이동할 때 누른 횟수인 len값과, +-를 눌러 이동하게 될 잔여 횟수를 더해 answer과 비교해줍니다. 모든 반복에서 최솟값을 탐색하게 되며 반복문이 끝나고 answer를 출력해주면 해결됩니다.
처음엔 나름의 규칙과 조건을 찾아 해결 해보려고 했으나, 몇몇 까다로운 반례가 있었고, 시간도 널널하여 완전탐색으로 해결해야하는 문제였다고 생각합니다.