백준 1107 리모컨 (Java,자바)

jonghyukLee·2022년 1월 3일
0

이번에 풀어본 문제는
백준 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를 출력해주면 해결됩니다.

📜 후기

처음엔 나름의 규칙과 조건을 찾아 해결 해보려고 했으나, 몇몇 까다로운 반례가 있었고, 시간도 널널하여 완전탐색으로 해결해야하는 문제였다고 생각합니다.

profile
머무르지 않기!

0개의 댓글