알고리즘/백준

공부 149일차: 백준 1107번 리모컨 자바 java

김발자~ 2022. 12. 26. 17:39
반응형

1107 리모컨

https://www.acmicpc.net/problem/1107

 

1107번: 리모컨

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

www.acmicpc.net

 

 

 

 


백준 1107번 문제 리모컨


문제


 

 

 

 


과정 생각해보기 & 오답


 

바로 오답부터..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.io.*;
import java.util.*;
 
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
        
        int n = Integer.parseInt(br.readLine());    // 채널
        
        
        int m = Integer.parseInt(br.readLine());    // 고장난 버튼 개수
        int[] brokenBtn = new int[m];    // 고장난 버튼 목록
        
        int[] originalBtn = {0123456789};
        ArrayList<String> btns = new ArrayList<String>();
        int count = 0;    // 버튼 누른 횟수
        int currentCh = 100;    // 현재 채널
        
        st = new StringTokenizer(br.readLine());
        for(int i = 0; i < m; i++) {
            brokenBtn[i] = Integer.parseInt(st.nextToken());
        }
 
        if(n == 100) {    // 원하는 채널이 100이면 움직일 필요 없으므로
            System.out.println(0);    // 0을 출력한 뒤
            return;                    // 코드를 끝낸다
        }
        
        for(int i = 0; i < 10; i++) {            
            // 오름차순으로 입력되는 게 아니므로 망가진 버튼 다 검사해야 함
            for(int num : brokenBtn) {
                if(originalBtn[i] == num) {
                    originalBtn[i] = -1;    // 고장났으면 -1로 초기화
                }
            }
            
            if(originalBtn[i] != -1) {
                btns.add(originalBtn[i]+"");    // list에 넣기
            }
        }
        
        /*디버깅
        System.out.println(Arrays.toString(originalBtn));
        for(String str : btns) {
            System.out.print(str+" ");
        }
        */
        
        /*
        구할 수 있는 숫자 조합 다 만들기 -> min = Math.min(min, n - 숫자조합 + 숫자의 자리수)
         */
    }
}
 
cs

 

이렇게 접근했는데 숫자 조합 만드는 데서 막혔다

배열에 주어진 숫자들로 만드려고 한다면 할 수는 있겠지만 너무 복잡하다는 생각..

 

그리고 방법을 찾았다

1부터 999,999까지 (n이 500,000이고, 금지된 숫자가 많을 때 999,999가 가장 가까울 수 있기 때문) 탐색하고, 

금지된 버튼이 들어가 있다면 탐색에서 제외한다

 

어떻게 조합할지를 고민하는 게 아니라, 다 구하고 거기서 제외시키는 것!

 

완전 브루트 포스 문제

 

참고 블로그

https://moonsbeen.tistory.com/64

https://nanyoungkim.tistory.com/124

https://1-7171771.tistory.com/37

 

 

 


정답 인정 코드


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.*;
import java.util.*;
 
public class Main {
    public static void main(String[] args) throws IOException{
        //BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //StringTokenizer st = null;
        Scanner sc = new Scanner(System.in);
        ArrayList<Integer> brokenBtn = new ArrayList<Integer>();
        
        int n = sc.nextInt();    // 채널
        int m = sc.nextInt();    // 고장난 버튼 개수
        
        //st = new StringTokenizer(br.readLine());
        for(int i = 0; i < m; i++) {
            brokenBtn.add(sc.nextInt());
        }
        
        int min = Math.abs(n - 100); // 모든 숫자버튼이 고장났을 때는 +, -로만 움직여야 한다
        for(int i = 0; i <1_000_000; i++) {
            String str = String.valueOf(i);
            int len = str.length();
            
            boolean isBreak = false;
            for(int j = 0; j < len; j++) {
                if(brokenBtn.contains(str.charAt(j)-'0')) {    
                    // 0~999,999에 해당하는 숫자 i의 자리수 중 하나가 고장난 버튼의 숫자라면
                    isBreak = true;
                    break;    // 빠져나온다 (그 숫자 거름)
                }
            }
            
            if(!isBreak) {
                min = Math.min(min ,Math.abs(n - i)+len);
            }
        }
 
        System.out.println(min);
    }
}
 
cs

 

다 똑같이해도 BufferedReader로 입력하면 NullPointer 런타임에러가 뜨는데 이유가 짐작가지 않는다

 

 

 


또 숫자 문제를 문자열로 바꿔서 더하려다가.............

직접 구하는 게 아니라 뺴는 여집합 같은 접근법도 있음을 다시 한 번 상기하기

 

반응형