리모컨 성공
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 | 256 MB | 61511 | 14544 | 9997 | 22.457% |
문제
수빈이는 TV를 보고 있다. 수빈이는 채널을 돌리려고 했지만, 버튼을 너무 세게 누르는 바람에, 일부 숫자 버튼이 고장났다.
리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있다. +를 누르면 현재 보고있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다. 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대 만큼 있다.
수빈이가 지금 이동하려고 하는 채널은 N이다. 어떤 버튼이 고장났는지 주어졌을 때, 채널 N으로 이동하기 위해서 버튼을 최소 몇 번 눌러야하는지 구하는 프로그램을 작성하시오.
수빈이가 지금 보고 있는 채널은 100번이다.
입력
첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼이 주어지며, 같은 버튼이 여러 번 주어지는 경우는 없다.
출력
첫째 줄에 채널 N으로 이동하기 위해 버튼을 최소 몇 번 눌러야 하는지를 출력한다.
풀이 접근
이문제가 완전탐색이라니... 완전탐색이라니..!!!
처음 접근할때는, 예외처리를 해준 후, 원하는 채널의 각 자리 수에 가장 근접한 수를 구한후, + - 횟수를 구해주었다.
이 방법이 맞는 줄알앗는데.. 전혀 아님 계속 틀림, 예외가 계속나옴 ㅠ
2시간후,, 구글링을 해보니 완전 탐색이란다..ㅠㅠ
[완전탐색 정답 코드]
package solved.Class;
import java.io.*;
import java.net.Inet4Address;
import java.util.*;
public class Main {
static int now = 100;
static boolean remotecon[] = new boolean[10];
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 chanel = Integer.parseInt(br.readLine());
int n = Integer.parseInt(br.readLine());
if(n!=0) {
String temp[] = br.readLine().split(" ");
for (String str : temp) {
int broken = Integer.parseInt(str);
remotecon[broken] = true;
}
}
if(chanel==100)
System.out.println(0);
else if(n==10){
System.out.println(Math.abs(chanel-now));
}
else{
int ans = Math.abs(now-chanel);
//목표채널 최대 자리수
for(int i=0;i<1000000;i++){
//i까지 이동한 후, +,-로이동 브루트포스
String number[] = Integer.toString(i).split("");
boolean flag = true;
//숫자로 이동 가능한지
for(String index : number){
if(remotecon[Integer.parseInt(index)]) {
flag = false;
break;
}
}
if(flag){
ans = Math.min(ans,number.length+Math.abs(i-chanel));
}
}
System.out.println(ans);
}
}
}
[처음 접근 틀린 코드]
package solved.Class;
import java.io.*;
import java.util.*;
public class Main {
static int now = 100;
static boolean remotecon[] = new boolean[10];
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 chanel = Integer.parseInt(br.readLine());
int n = Integer.parseInt(br.readLine());
if(n!=0) {
String temp[] = br.readLine().split(" ");
for (String str : temp) {
int broken = Integer.parseInt(str);
remotecon[broken] = true;
}
}
if(chanel==100)
System.out.println(0);
else if(n==10){
System.out.println(Math.abs(chanel-now));
}
else{
int nearby = check_nearby_chanel(chanel);
int size = Integer.toString(nearby).length();
System.out.println(Math.abs(chanel-nearby)+size);
}
}
public static int check_nearby_chanel(int chanel){
String chanel_str = Integer.toString(chanel);
int size = chanel_str.length();
int number[] = new int[size];
for(int i=0;i<size;i++){
int chanel_index_number = Integer.parseInt(chanel_str.substring(i,i+1));
int before_number = get_before_number(chanel_index_number);
int after_number = get_afeter_number(chanel_index_number);
number[i] = Math.abs(before_number-chanel_index_number) < Math.abs(after_number-chanel_index_number) ? before_number: after_number;
}
int result=0;
for(int i=0;i<size;i++)
result+=number[i]*Math.pow(10,size-1-i);
return result;
}
private static int get_before_number(int chanel_index_number) {
int result = Integer.MAX_VALUE;
for(int i=chanel_index_number;i>=0;i--){
if(!remotecon[i])
return i;
}
return result;
}
private static int get_afeter_number(int chanel_index_number) {
int result = Integer.MAX_VALUE;
for(int i=chanel_index_number;i<10;i++){
if(!remotecon[i])
return i;
}
return result;
}
}
'알고리즘 문제' 카테고리의 다른 글
[백준] boj 2606 java - 바이러스 (bfs) (0) | 2022.03.25 |
---|---|
[백준] boj 1541 java "잃어버린 괄호" - 그리디 알고리즘 (0) | 2022.03.04 |
[백준] boj 1389 자바 "케빈 베이컨의 6단계 법칙" - (bfs, 플루이드 와샬) (0) | 2022.03.02 |
[백준] boj 1436 java "1로 만들기" (dp, 다이나믹 프로그래밍) (0) | 2022.02.26 |
[백준] java boj 1012 - 유기농 배추 (DFS) (0) | 2022.02.14 |