Algorithm/baekjoon

리모컨

마닐라 2022. 2. 4. 16:39

📍 문제 설명

 

💡 접근

누를 수 있는 버튼 중 거리가 최소가 되는 지점을 찾으려면 완전 탐색을 하는 수 밖에는 없었다.

이동하려는 채널은 500000이하지만 9를 제외한 모든 버튼이 고장났을 수도 있으므로 999999에서 이동하는 횟수도 고려해야 했다.

1.0~999999까지 버튼을 눌러야 하는 횟수를 구한다. 횟수 중 최솟값을 계속 누적해나간다.

- 더해야하는 연산자의 갯수는 눌러야하는 번호의 갯수 - 현재 숫자의 갯수이다.

- (5457-5455) = 2 -> 5455++, (5457-5459) = -2 -> 5455--

2.누르지 못하는 번호라면 다음 숫자로 넘어간다.

 

 

👩‍💻 코드

import java.util.*;

public class Main {
    static int n, m, answer, cnt, min;
    static String a, t;
    static char[][] board,clone;
    static boolean[] arr;
    static boolean[][] visited;
    static int[] breakdown;
    static int[] dx = {-1, 0, 1, 0,}; //북동남서
    static int[] dy = {0, 1, 0, -1};

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);

        n = kb.nextInt(); //눌러야하는 번호
        m = kb.nextInt(); //고장난 번호의 갯수
        arr = new boolean[10]; //고장난 번호
        for(int i = 0; i < m; i++) arr[kb.nextInt()] = true;

        T.solution();
        System.out.println(answer);
    }

    private void solution() {
        //초기채널 설정
        answer = Math.abs(n - 100);
        if(answer == 0) return;

        //0부터 999999까지 최소 버튼 횟수 구하기
        for(int i = 0; i < 1000000; i++) {
            String s = String.valueOf(i);
            //고장난 버튼 확인 변수
            boolean flag = true;
            for(int j = 0; j < s.length(); j++) {
                //고장난 버튼이 포함되어 있으면 해당 번호 못 누른다.
                if(arr[s.charAt(j) - '0']) {
                    flag = false;
                    break;
                }
            }
            //누를 수 있는 버튼이면 그때 계산
            //n - i는 '+'나 '-' 연산자가 필요한 횟수, s.length()는 현재 숫자의 버튼 갯수
            if(flag) answer = Math.min(Math.abs(n - i) + s.length(), answer);

        }
    }
}

'Algorithm > baekjoon' 카테고리의 다른 글

수 이어쓰기  (0) 2022.02.04
테트로미노  (0) 2022.02.04
사탕 게임  (0) 2022.01.31
히스토그램==========  (0) 2022.01.30
  (0) 2022.01.30