본문 바로가기
문제풀이

1107 리모컨 - JAVA

by 이숴 2023. 5. 2.
반응형

https://www.acmicpc.net/problem/1107

 

1107번: 리모컨

첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다.  둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼

www.acmicpc.net

[문제요약]

  • 고장난 리모컨은 버튼이 0부터 9까지 숫자, +와 -가 있다.
  • +를 누르면 현재 보고있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다. 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대 만큼 있다.
  • 수빈이가 지금 이동하려고 하는 채널은 N이다. 어떤 버튼이 고장났는지 주어졌을 때, 채널 N으로 이동하기 위해서 버튼을 최소 몇 번 눌러야하는지 구하는 프로그램을 작성

[문제풀이]

저는 우선 고장난 버튼이 입력이 되었는지 확인하였는데요. 현재 채널은 100번이니 n이 100일 경우에는 채널을 이동하지 않아도 되니 0을 반환하고, 버튼을 눌러 목표 채널로 갔을 경우와 +, - 버튼으로 목표채널로 갔을 경우를 비교하여 최소값을 출력하였습니다.

 

이제 이외의 경우의 수들은 고장난 버튼이 있을 경우를 고려했을 때인데요.

 

고장난 버튼이 있다면 일단 미리 선언해두었던 브튼 개수만큼의 배열에 버튼 위치별로 true를 주어 고장난 버튼을 확인하였습니다.

그 다음 for문을 돌아 0부터 999999까지 숫자를 늘려가면서 번호가 고장나지 않은 번호를 눌러서 표현할 수 있다면(isTrue) 그 번호에서  +, -로 값을 찾을때 리모콘을 누르는 횟수를 계산합니다.

 

그리고 값들을 비교하여 최소값을 출력하죠. 그러면 결과를 얻으실 수 있으십니다.

 

[코드]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class 리모컨 {
    static boolean[] broken = new boolean[11];
    static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws IOException {

        int n = Integer.parseInt(bf.readLine());
        int m = Integer.parseInt(bf.readLine());

        int result = Math.abs(n - 100);

        if (m == 0) {
            if (n == 100) {
                System.out.println(0);
            } else {
                String s = String.valueOf(n);
                result = Math.min(result, s.length());
                System.out.println(result);
            }
        } else {

            int[] s = Arrays.stream(bf.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();

            for (int idx : s) {
                broken[idx] = true;
            }

            for (int idx = 0; idx < 1000000; idx++) {

                int lgth = getLength(idx);
                boolean isTrue = false;

                for (int j = 0; j < lgth; j++) {
                    if (broken[getAnInt(idx, j)]) {
                        isTrue = true;
                        break;
                    }
                }
                if (!isTrue) {
                    result = Math.min(Math.abs(n - idx) + lgth, result);
                }
            }
            System.out.println(result);
        }
    }

    private static int getAnInt(int idx, int j) {
        return (idx / (int) Math.pow(10, j)) % 10;
    }

    private static int getLength(int idx) {
        return String.valueOf(idx).length();
    }
}
반응형

'문제풀이' 카테고리의 다른 글

등굣길  (0) 2023.05.09
문자열 폭발 - 문자열  (2) 2023.04.18
롤케이크_자르기-구현 JAVA  (0) 2023.04.10
위장-해쉬  (0) 2023.04.05
부대복귀-BFS  (0) 2023.03.28

댓글