반응형
https://www.acmicpc.net/problem/1107
1107번: 리모컨
첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼
www.acmicpc.net
✅ 골드 Ⅴ
🔶 풀이
임의의 버튼이 고장났을 경우 채널 N으로 이동하기 위해서 눌러야하는 버튼의 최소값.
완전탐색 브루트포스 문제.
1️⃣ 지금 보고 있는 채널은 100번
2️⃣ 고장난 버튼이 없을 수도 있다.
3️⃣ 완전탐색의 범위는 0 - 999,999
필자는 주로 StringTokenizer을 사용하는데 2️⃣번 예외에서 고장난 버튼이 0개면 Null Point 에러가 발생한다. 때문에 아래와 StringTokenizer을 사용한다면 아래와 같은 조건문을 걸어줘야된다.
if (M == 0) {
// 100번 채널에서 +, -버튼으로만 이동 vs 숫자 버튼만 눌러서 이동
System.out.println(Math.min(Math.abs(100 - N), String.valueOf(N).length()));
return;
}
3️⃣번 예외가 이해가 안갈 수 있다.
채널의 최대값은 500,000인데 왜 999,999까지 신경써야하는가?
고장난 버튼이 0부터 8까지 고장났을 경우가 존재하기 때문이다.
9를 제외한 모든 버튼이 고장났고, 초기에 100번 채널에서 +, - 버튼만 이용해서 이동하는 것보다 더 가까운 곳이 목표하는 채널이라면 어쩔 수 없이 999,999번을 눌러서 내려와야된다.
<최종코드>
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 목표 채널
int M = Integer.parseInt(br.readLine()); // 고장난 버튼 개수
if (M == 0) {
System.out.println(Math.min(Math.abs(100 - N), String.valueOf(N).length()));
return;
}
boolean[] button = new boolean[10];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i=0; i<M; i++) {
button[Integer.parseInt(st.nextToken())] = true;
}
// +, - 버튼만 누른 경우
int ans = Math.abs(100 - N);
int cnt = 987654321;
boolean chk = true;
for (int i=0; i<1000000; i++) {
String Channel = String.valueOf(i);
chk = true;
for (int idx=0; idx<Channel.length(); idx++) {
if (button[Channel.charAt(idx) - '0']) {
chk = false;
break;
}
}
if (!chk) continue;
cnt = Math.min(cnt, Channel.length() + Math.abs(i - N));
}
System.out.println(Math.min(ans, cnt));
}
}
반응형
'알고리즘 > 구현 & 그리디 & 브루트포스' 카테고리의 다른 글
[JAVA] 백준 14916번: 거스름돈 (0) | 2023.12.11 |
---|---|
[JAVA] 백준 15736번: 청기 백기 (0) | 2023.11.07 |
[JAVA] 백준 5107번: 마니또 (0) | 2023.07.31 |
[자바로 푸는 백준] 18430번 무기 공학 (0) | 2023.06.20 |
[자바로 푸는 백준] 11000번 강의실 배정 (0) | 2023.05.17 |