알고리즘/구현 & 그리디 & 브루트포스

[JAVA] 백준 1107번: 리모컨

K.두부 2023. 9. 18. 16:29
반응형

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));
    }
}

 

반응형