티스토리 뷰

Algorithm/BOJ

1107 리모컨

henry1214 2018. 3. 14. 18:32

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



현재 채널이 100이고 리모컨의 버튼을 눌러서 채널 N으로 이동하려고 한다. 리모컨에 고장난 버튼이 있을 수 있다. 이 때 버튼을 최소 몇 번 눌러야 하는지 구하는 문제이다. 최소로 버튼을 누르려면 N과 최대한 가까운 채널을 숫자만 눌러서 이동한 후 나머지 차를 +나 -버튼을 이용해서 이동하면 된다. 먼저 ans을 N과 100의 절대값 차(+나 -로만 이동하는 경우)로 둔다. 그리고 N보다 큰 채널로 이동하는 경우, 작은 채널로 이동하는 경우 각각에 대하여 ans보다 작으면 갱신해주면 된다.



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
#include <cstdio>
 
int min(int a,int b) { return a<b?a:b; }
int abs(int n) { return n>0?n:-n; }
 
int main()
{
    int n,m,t,cnt;
    scanf("%d %d",&n,&m);
    int ans=abs(n-100);
    bool b[10],flag; for(int i=0;i<10;i++) b[i]=true;
    while(m--scanf("%d",&t),b[t]=false;
    for(int i=n;i<=1000000;i++)
    {
        flag=true,cnt=0,t=i;
        while(true)
        {
            if(!b[t%10]) { flag=falsebreak; }
            t/=10,cnt++;
            if(t==0break;
        }
        if(flag) { ans=min(ans,cnt+i-n); break; }
    }
    for(int i=n;i>=0;i--)
    {
        flag=true,cnt=0,t=i;
        while(true)
        {
            if(!b[t%10]) { flag=falsebreak; }
            t/=10,cnt++;
            if(t==0break;
        }
        if(flag) { ans=min(ans,cnt+n-i); break; }
    }
    printf("%d\n",ans);
    return 0;
}
cs


'Algorithm > BOJ' 카테고리의 다른 글

12026 BOJ 거리  (0) 2018.03.30
5525 IOIOI  (0) 2018.03.14
2138 전구와 스위치  (0) 2018.03.14
2573 빙산  (0) 2018.03.14
9019 DSLR  (0) 2018.03.14
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday