백준 1107번 실패 (java)

byeol·2023년 2월 18일
0
post-thumbnail

실패

일단 엄청 이상하게 접근했다.

첫번째 이상한 접근
처음에 저 채널이랑 같은 숫자 만드려고 10씩 곱하면서 더함 굳이 그럴 필요없다 그냥 저 숫자가 눌리기만 하면되는 거였다.

두번째 이상한 접근
저 채널을 만들 수 있는 최소의 수를 만드려고 노력했다.
코드에 if문, else if문 엄청 많아 졌다.
마지막에 최소의 수+(찾고자 하는 채널-최소의 수) = 최소의 수+ (+나 -한 회수) = 리모컨 누른 횟수
이렇게 접근해서 하나씩 앞뒤로 누를 수 있는 방안을 생각해야 했다.

이 문제는 완전 탐색 문제였다.
그냥 다 탐색하는 것

풀이는 아래와 같다.

  • <내가 저 수를 만들 때 모든 번호가 다 고장나서 +와 -로 저 채널에 접근한다는 가정 아래에 있는 수>

  • 그냥 0번부터 999,999번까지(최소가 500,000이지만 0번부터 8까지 고장난 경우 최대 채널) 다 눌러본다. 그 번호 중에서 내가 가지고 있는 리모콘 번호로 만들 수 있는 번호가 나온다.

    이 번호에서 나는 이제 +나 -를 통해서 채널에 도달해야 한다.
    따라서 총 누른 횟수 = 내가 누른 번호의 길이 - (내가 누른 번호 - 원하는 채널)의 절대값

    이 값을 min에 저장하고 나올 때마다 이 값과 비교해서 최솟값을 찾아가는 것이다.

  • 그리고 마지막에 <내가 저 수를 만들 때 모든 번호가 다 고장나서 +와 -로 저 채널에 접근한다는 가정 아래에 있는 수> 와 min을 비교해서 더 작은 값이 정답이다!

  • 한가지 더 M이 0이 아닌 경우에만 고장난 리모컨의 채널을 받는 것!

    StringTokenizer st =new StringTokenizer(br.readLine()," ");
    boolean[] brk = new boolean[10];
    for(int i=0;i<M;i++){
             brk[Integer.parseInt(st.nextToken())] = true;
           }

    위와 같이 선언하면

    Nullpointer로 런타임 에러가 발생한다.

    따라서 M이 0인 경우에는 아예 문장을 받지 않도록 해야한다.

     boolean[] brk = new boolean[10];
     if(M!=0) {
               String brk_line = br.readLine();
               StringTokenizer st = new StringTokenizer(brk_line, " ");
               for (int i = 0; i < M; i++) {
                   brk[Integer.parseInt(st.nextToken())] = true;
               }
           }

    위와 같이 선언해주자


전체 풀이는 아래와 같다.

import java.util.*;
import java.io.*;

public class Main{

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw =new BufferedWriter(new OutputStreamWriter(System.out));

        int N = Integer.parseInt(br.readLine());

        int M = Integer.parseInt(br.readLine());

        boolean[] brk = new boolean[10];
        if(M!=0) {
            String brk_line = br.readLine();
            StringTokenizer st = new StringTokenizer(brk_line, " ");
            for (int i = 0; i < M; i++) {
                brk[Integer.parseInt(st.nextToken())] = true;
            }
        }



       // StringTokenizer st =new StringTokenizer(br.readLine()," ");
        //boolean[] brk = new boolean[10];
        //for(int i=0;i<M;i++){
           // brk[Integer.parseInt(st.nextToken())] = true;
       // }
       

        int max = Math.abs(N-100); // 100번부터 +,-만 눌러서 도달

        int cnt =0;
        int min = Integer.MAX_VALUE;

        for(int i=0;i<=999999;i++){

            String chan = Integer.toString(i);

            boolean tag = true;
            for(int j=0;j<chan.length();j++) { // 누른 채널이 리모콘으로 만들 수 있는지 확인
                int a = chan.charAt(j) - '0';
                if (brk[a]) { // 하나라도 누를 수 없으면 만들 없는 채널
                    tag = false;
                    break;
                }//if
            }//for
            if(tag==false) continue; // 못 만들어서 다시 for문
            else{
                cnt = chan.length() + Math.abs(i-N);
                if(cnt<min) min=cnt;



            }

        }//for

        if(max>min) bw.write(Integer.toString(min));
        else bw.write(Integer.toString(max));


        bw.flush();
        bw.close();
        br.close();


    }

}
profile
꾸준하게 Ready, Set, Go!

0개의 댓글