728x90
https://www.acmicpc.net/problem/1107
1107번: 리모컨
첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼
www.acmicpc.net
문제
수빈이는 TV를 보고 있다. 수빈이는 채널을 돌리려고 했지만, 버튼을 너무 세게 누르는 바람에, 일부 숫자 버튼이 고장났다.
리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있다. +를 누르면 현재 보고있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다. 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대 만큼 있다.
수빈이가 지금 이동하려고 하는 채널은 N이다. 어떤 버튼이 고장났는지 주어졌을 때, 채널 N으로 이동하기 위해서 버튼을 최소 몇 번 눌러야하는지 구하는 프로그램을 작성하시오.
수빈이가 지금 보고 있는 채널은 100번이다.
입력
첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼이 주어지며, 같은 버튼이 여러 번 주어지는 경우는 없다.
출력
첫째 줄에 채널 N으로 이동하기 위해 버튼을 최소 몇 번 눌러야 하는지를 출력한다.
728x90
예제 입력 1
5457
3
6 7 8
예제 출력 1
6
예제 입력 2
100
5
0 1 2 3 4
예제 출력 2
0
예제 입력 3
500000
8
0 2 3 4 6 7 8 9
예제 출력 3
11117
예제 입력 4
100
3
1 0 5
예제 출력 4
0
예제 입력 5
14124
0
예제 출력 5
5
예제 입력 6
1
9
1 2 3 4 5 6 7 8 9
예제 출력 6
2
예제 입력 7
80000
2
8 9
예제 출력 7
2228
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
// 입력
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
boolean[] broken = new boolean[10];
if(M != 0) st = new StringTokenizer(br.readLine()); // 고장난 버튼이 있을 때만 입력 받음
for (int i = 0; i < M; i++) {
broken[Integer.parseInt(st.nextToken())] = true;
}
int result = Math.abs(N - 100); // 나올 수 있는 최대 값
if(N != 100) { // 이동하려고 하는 채널이 100이면 이미 보고 있는 채널이 100이기 때문에 구하지 않아도 됨
int[] arr = new int[2];
for1: for (int i = 0; i <= Math.abs(N - 100); i++) {
arr[0] = Math.max(N - i, 0); // N보다 작은 채널에서 +로 채널 이동하는 경우
arr[1] = N + i; // N보다 큰 채널에서 -로 채널 이동하는 경우
for (int a : arr) {
boolean flag = true; // a 채널로 가기 위해 모든 숫자 버튼을 누를 수 있으면 true
for (int j = 1; j <= String.valueOf(a).length(); j++) {
int idx = (int) ((a % Math.pow(10, j)) / Math.pow(10, j - 1)); // a의 j-1 자릿수 가져오기
if(broken[idx]) { // 고장나있는 버튼이 있다면
flag = false;
break;
}
}
if(flag) { // 버튼을 모두 누를 수 있다면
result = Math.min(result, i + String.valueOf(a).length());
break for1;
}
}
}
}
System.out.println(result);
}
}
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[백준, BOJ 1780] 종이의 개수 (java) (0) | 2023.03.11 |
---|---|
[백준, BOJ 1541] 잃어버린 괄호(java) (0) | 2023.03.11 |
[백준, BOJ 11724] 연결 요소의 개수 (java) (1) | 2023.03.11 |
[백준, BOJ 11723] 집합 (java) (1) | 2023.03.11 |
[백준, BOJ 11279] 최대 힙 (java) (0) | 2023.03.11 |