본문 바로가기

BOJ

백준 1107 / 리모컨



브루트포스 문제인데, 수학문제에 가깝다.


먼저 멀쩡한 버튼으로 숫자를 누르고 목표 채널로 한칸씩 이동할때 걸리는 카운트를 비교하는 코드이다.



굉장히 무식한 코드인데 재귀를 이용한 코드보다 보기 깔끔하고 이해하기 쉽다.


1000000번만 돌면되기 때문에 걸리는 시간도 그리 크지 않다.


코드


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
#include <iostream>
using namespace std;
bool broken[10];
int possible(int c) {
    if (c == 0) {
        if (broken[0]) { // 0번이 고장났을때.
            return 0;
        }
        else {
            return 1;
        }
    }
    int len = 0;
    while (c > 0) {   //버튼이 하나라도 고장났으면 0을 리턴
        if (broken[c % 10]) {
            return 0;
        }
        len += 1;
        c /= 10;
    }
    return len;
}
int main() {
    int n;
    cin >> n;
    int m;
    cin >> m;
    for (int i = 0; i < m; i++) {
        int x;
        cin >> x;
        broken[x] = true;
    }
    int ans = n - 100;
    if (ans < 0) {
        ans = -ans;
    }
    for (int i = 0; i <= 1000000; i++) { //백만까지 눌러보고 비교.
        int c = i;
        int len = possible(c);
        if (len > 0) {
            int press = c - n;
            if (press < 0) {
                press = -press;
            }
            if (ans > len + press) {
                ans = len + press;
            }
        }
    }
    printf("%d\n", ans);
    return 0;
}
cs


'BOJ' 카테고리의 다른 글

백준 2529 / 부등호  (0) 2019.01.18
백준 6064 / 카잉 달력  (0) 2019.01.18
백준 5719 / 거의 최단 경로  (0) 2019.01.17
백준 1753 / 최단경로  (0) 2019.01.13
백준 9205 / 맥주 마시면서 걸어가기  (0) 2019.01.11