본문 바로가기

CodingTEST

[백준 1107] 리모컨(JAVA)

반응형

백준 1107번 문제 - 리모컨

1107번: 리모컨

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

www.acmicpc.net


문제 분석 

 

 

  • 100번 채널에 있는 수빈이가 채널을 N까지 이동하려면 버튼을 최소 몇번 눌러야하는지 출력해라.
    • 리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있고, 일부 숫자 버튼은 고장났다.
    • +를 누르면 현재 보고있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다.
    • 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대 만큼 있다.

해결 포인트

 
어려워 죽을 뻔 했습니다 (결국 못풀었다)

  • 완전 탐색 사용
  • 결과의 초기 값은 원하는 숫자와 100의 차이 값
    • Math.abs(n) : n의 절대값
  • 0부터 Math.abs(targer-i) 까지 확인
    • 해당 수를 만들기 위해 고장난 버튼이 필요한 경우 그만
    • 고장난 버튼을 사용하지 않을 경우, 해당 숫자 자리 수 + 원하는 숫자 - 현재 숫자

 

코드

 

import java.util.*;

public class Main {

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

        int target = scan.nextInt();
        int m = scan.nextInt();

        boolean[] broken = new boolean[10];
        for(int i = 0; i < m; i++) {
            int n = scan.nextInt();
            broken[n] = true;
        }

        int result = Math.abs(target - 100); //초기값 설정
        for(int i = 0; i <= 999999; i++) {
            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) { //i를 누를때 고장난 버튼을 누르지 않는다면
                int min = Math.abs(target - i) + len; //i를 누른 후(len) target까지 이동하는 횟수(target - i)
                result = Math.min(min, result);
            }
        }
        System.out.println(result);
    }
}
반응형

'CodingTEST' 카테고리의 다른 글

[백준 9019] DSLR (JAVA)  (1) 2024.01.06
[백준 5430] AC (JAVA)  (1) 2024.01.06
[백준 16928] 뱀과 사다리 게임(JAVA)  (1) 2024.01.02
[백준 10026] 적록색약 (JAVA)  (1) 2024.01.02
[백준 6064] 카잉 달력 (JAVA)  (1) 2023.12.28