Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

대웅짱님의 블로그

[1107] 리모컨 본문

알고리즘/BOJ

[1107] 리모컨

대웅짱 2018. 6. 22. 15:04


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



보고 싶은 TV 채널 N이 주어졌을 때


최소 몇 번의 리모컨 버튼 누름으로 그 채널에 갈 수 있는지를 물어보는 문제이다.


리모컨은 M개의 버튼이 고장나 있는데 고장나는 버튼은 숫자 버튼이고


위 아래 버튼은 고장나지 않는다.




처음에는 이 문제를 그리디로 접근해서


1. 100 - N번 채널의 절대 값

2. N - 고장나지 않은 버튼으로 갈 수 있는 N번 채널의 가장 가까운 아래 채널의 절대 값 + 길이

3. N - 고장나지 않은 버튼으로 갈 수 있는 N번 채널의 가장 가까운 위에 채널의 절대 값 + 길이


위 세개 중 최소 값을 구해서 풀려고 했었는데


이 가장 가까운 값을 고르는게 생각보다 싶지 않아


그냥 완전탐색을 이용하여 풀었다.


시간제한은 2초이고 N이 최대 500000이니 O(N)에 충분히 된다.


1. 100 - N번 채널의 절대 값

2. N - 1~10000000까지의 채널 중 고장나지 않는 버튼으로 갈 수 있는 채널의 절대 값 + 길이


위의 두 경우 중 최소 값을 선택하면 된다.


1000000까지 확인하는 이유는 채널은 무제한이고 위로 이동해서 내려오는게 더 가까울 수도 있기 때문이다.


유일한 예외는 채널이 0번 일 때 check함수로는 길이를 못받아오기 때문에 그것에 관한 예외만 해주었다.



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
#include<cstdio>
#include<algorithm>
using namespace std;
int n, m, cnt;
int arr[11];
 
bool check(int pos){
    if(pos==0return !arr[pos];
    while(pos){
        if(arr[pos%10]) return false;
        pos/=10;
        cnt++;
    }
    return true;
}
 
int main(){
    scanf("%d %d"&n, &m);
    for(int i=0; i<m; i++){
        int num;
        scanf("%d"&num);
        arr[num] = 1;
    }
 
    int mini = (100 - n);
    if(mini < 0) mini *= -1;
 
    for(int i=0; i<1000000; i++){
        cnt = 0;
        if(check(i)){
            if(i==0) cnt=1;
            int diff = (i - n);
            if(diff < 0) diff *= -1;
            diff+=cnt;
            mini = min(mini, diff);
        }
    }
 
    printf("%d\n", mini);
 
    return 0;
}
cs




'알고리즘 > BOJ' 카테고리의 다른 글

[9997] 폰트  (0) 2018.07.02
[2823] 유턴 싫어  (0) 2018.06.26
[10972] 다음 순열  (0) 2018.06.25
[1707] 이분 그래프  (0) 2018.06.22
BOJ 문제들  (0) 2018.06.22