1107

suhan cho·2022년 6월 22일
0

해결해야하는 것

  1. 처음 수에서 이동하는게 빠른지 아니면 바꾼 수가 더 빠른지
    2, 버튼이 고장날 시 어떤 수를 택해야 하는지

해결방법

  1. target번호에 처음 채널을 빼고, 선택가능한 바꾼수와 어떤게 버튼 누르는 횟수가 적은지 판단
  2. 완전탐색 방법으로 하여 고장난 버튼을 눌렀을 경우 탐색을 종료하고 for문을 진행 고장난 버튼을 아무것도 누르지 않았을 경우 1번처럼 두가지를 비교하여 최소 횟수 선택

0부터 999999까지 <-i
str에 넣고
길이를 str.length()로 한다

result = target- 처음채널
부숴진 버튼은 false로 해놓고
0부터 len의 길이만큼 for을 하는데
만약 brocken[str.charAt(j) - '0'] -> 고장난 버튼을 누른다면
탐색을 종료

만약 고장난 버튼 안누른다면
min = abs(target-i)+len
result = min(min,result)

/*
 * 0~9숫자와 +,-가 있다.
 * +는 +1 -는 -1이다. 0에서 -는 변하지 않음
 * 이동하려는 채널 N으로 이동하기
 * 어떤 버튼이 고장났는지 주어졌을 때,
 * 채널 n을 이동하기 위해서 버튼을 최소 몇 번 눌러야하는지
 * 현재 100번
* */

import java.util.Scanner;

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

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

         boolean[] brocken = new boolean[10];
         for(int i=0; i<m; i++){
             int n = sc.nextInt();
             brocken[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(brocken[str.charAt(j) - '0']){ //고장난 버튼 누른다면
                     isBreak=true;
                     break; //더이상 탐색x
                 }
             }
             if(!isBreak){//고장난 버튼을 안누른다면
                 int min = Math.abs(target - i) + len;//i를 누른후(len) target까지 이동하는 횟수(target-i)
                 result = Math.min(min, result);
             }
         }
         System.out.println(result);
     }

출처: https://moonsbeen.tistory.com/64

profile
안녕하세요

0개의 댓글