1107 - 리모컨

solution

code

#include <iostream>
#include <string>
using namespace std;

int upward_search(int);
int downward_search(int);
bool possible(int);
bool valid[10] = {true, true, true, true, true, true, true, true, true, true};

bool possible(int alter)
{
    string alter_s = to_string(alter);
    for(int i = alter_s.length()-1; i >= 0; i--)
    {
        int idx = alter_s[i] - '0';
        if(!valid[idx]) return false;
    }
    return true;
}

int upward_search(int alter)
{
    while(!possible(alter)) alter++;
    return alter;
}

int downward_search(int alter)
{
    while(!possible(alter) && alter >= 0) alter--;
    return alter;
}

int main()
{
    int N, M;
    cin >> N >> M;
    int invalid;
    for(int i = 0; i < M; i++)
    {
        cin >> invalid;
        valid[invalid] = false;
    }

    int num, distance, up, down;
    if(!possible(N))
    {
        bool zero = true;
        for(int i = 1; i < 10; i++) 
        {
            if(valid[i]) zero = false;
        }
        if(!zero) up = upward_search(N);
        down = downward_search(N);
        if(up-N >= N-down && N-down > 0 && down >= 0)
        {
            distance = N-down;
            num = down;
        }
        else
        {
            distance = up-N;
            num = up;
        }
    }
    else 
    {
        distance = 0;
        num = N;
    }

    int _100man = (N > 100) ? N-100 : 100-N;

    string num_s = to_string(num);
    int button = (_100man > num_s.length() + distance) ? num_s.length() + distance : _100man;
    cout << button << endl;

    return 0;
}

ref

1107번: 리모컨