ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 1107 - 리모컨
    백준 algorithm 2020. 6. 2. 14:19
    반응형

    문제 설명

     

     

    => 브루트 포스 문제입니다.

     

    • 이동할 채널 C를 정합니다.

    • C에 포함되어있는 숫자 중에 고장 난 버튼이 있는지 확인합니다.

    • 고장 난 버튼이 포함되어 있지 않다면 |C-N|을 계산해 +나 -버튼을 몇 번 눌러야 하는지를 계산합니다. 

    => 위의 방식에 따라 문제를 풀이합니다. 

     

     

     

     

     

     

    => 고장난 버튼을 확인하기 위해 broken []이라는 bool형 array를 사용하였습니다. 

    => 채널은 50만이지만, 숫자 버튼을 눌러서 이동하는 채널은 100만까지 허용하여야 합니다. (현재의 위치 100 때문)

    => 현재 위치에서 +or -를 눌러서 타겟하는 C로가는 방법

     

    • 현재 위치에서 + or -를 눌러서 타깃 C로 이동하는 방법

    • 채널 버튼을 눌러 타겟으로 이동한 다음 버튼을 눌러 이동하는 방법

    => 위의 두가지 중에 최소의 값을 찾아 원하는 값을 찾아야 합니다. 

     

    <현재의 숫자가 고장난 버튼이 있는지 없는지 확인하는 함수>

    int possible(int c)
    {
        if( c==0)
        {
            if(broken[0]) //
            {return 0;}
            else{
                return 1;
            }
        }
        
        int len =0;
        while ( c>0 )
        {
            if(broken[c%10]){
                return 0;
            }
            len ++;
            c /=10;
        }
        return len;
    }
    

     

     

     

     

    <code>

    #include <iostream>
    #include <algorithm>
    #include <string>
    
    using namespace std;
    
    bool broken[10];//false
    int possible(int c)
    {
        if( c==0)
        {
            if(broken[0]) //
            {return 0;}
            else{
                return 1;
            }
        }
        
        int len =0;
        while ( c>0 )
        {
            if(broken[c%10]){
                return 0;
            }
            len ++;
            c /=10;
        }
        return len;
    }
    
    int main()
    {
        
        ios_base::sync_with_stdio(false);
        cin.tie(nullptr);
        cout.tie(nullptr);
        
        int N;
        cin >> N;
        
        int m;
        cin >> m;
        for(int i=0; i<m; i++)
        {
            int x;
            cin >>x;
            broken[x]=true; //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 > press + len)
                {
                    ans = press + len;
                }
            }
        }
        cout << ans<<'\n';
        
    }
    

     

     

     

     

    실행 화면 1
    실행 화면 2

    반응형

    '백준 algorithm' 카테고리의 다른 글

    백준 1748 - 수 이어 쓰기 1  (0) 2020.06.02
    😭백준 6064 - 카잉 달력  (0) 2020.06.02
    백준 1476 - 날짜 계산  (0) 2020.06.01
    백준 3085 - 사탕 게임  (0) 2020.05.31
    백준 2309 - 일곱난쟁이  (0) 2020.05.16

    댓글

Designed by Who.