[java] 백준 - 리모컨

세상을 바꾸는 개발자·2023년 5월 18일
0

[문제링크 - 백준 - 리모컨] https://www.acmicpc.net/problem/1107

  • 리모컨으로 누를 수 있는 수에 대해 모든 경우의 수를 따져야 한다.
  • 숫자 0이 + 또는 - 하여 target까지 갈 수 있는 횟수를 매 번 구한다.
  • 거기에 그 숫자를 눌러야하는 횟수까지 더해야한다.

예를 들면 target은 3456인데 i가 3457이라면
3을 눌렀으니 한 번, 4를 눌렀으니 한 번, 5를 눌렀으니 한 번, 7을 눌렀으니 한 번
-> 그렇게 3457을 누른 후 -를 한 번 해야하므로 또 한 번 총 5번이 눌러진다.

💡 느낀점
입력값이 0일 때를 주의하자!
고장난 버튼이 없을 경우에 st = new StringTokenizer(br.readLine());로 읽으려해서 런타임에러가 났었다.

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));
        StringTokenizer st;
        int target = Integer.parseInt(br.readLine());
        int m = Integer.parseInt(br.readLine());

        boolean[] broken = new boolean[10];

        if(m > 0) {
            st = new StringTokenizer(br.readLine());
            for (int i = 0; i < m; i++) {
                int n = Integer.parseInt(st.nextToken());
                broken[n] = true;
            }
        }

        int result = Math.abs(target - 100); //처음 시작 번호가 100이므로 100에서 target까지 갈 수 있는 최대값으로 설정
        for(int i = 0; i <=999999; i++) { //target은 최대 500000이어도 999999에서 조절하는 게 더 빠를 경우가 있으므로
            String str = String.valueOf(i);
            int len = str.length();

            boolean isBreak = false;
            for(int j = 0; j < len; j++) {
                if(broken[str.charAt(j) - '0']) { //고장난 버튼이면 패스
                    isBreak = true;
                    break; 
                }
            }
            if(!isBreak) { 
                int min = Math.abs(target - i) + len; //현재 번호에서 target까지 눌러야하는 횟수 + 해당 번호의 길이(하나하나씩 눌러야하므로)
                result = Math.min(min, result);
            }
        }
        System.out.println(result);
    }
}
profile
초심 잃지 않기

0개의 댓글

관련 채용 정보