문제

문제 링크

어떻게 접근할 것인가

  • 고민고민하다가 결국에 사람처럼 되는 수를 하나씩 늘리면서 확인하는 bruteforce를 생각해냈다.

주의할 점

  • 100에서 부터의 거리가 최종 구한 값보다 크다면 100에서의 거리를 출력해라
  • 만약 정답이 10까지의 거리를 구한다고 할때 11보다 9에서 쓰는게 개수를 하나 덜 쓴다. 즉 빼기 값을 먼저 확인해야한다.
  • 10개 모두 고장난 경우 그냥 100부터의 거리를 출력해라!

코드

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

int d[2] = {-1, 1}, num[10], temp, n, m, cnt, from100;
string s;

int main(){
    scanf("%d %d", &n, &m);
    from100 = n > 100 ? n - 100 : 100 - n;
    for(int i = 0; i < m; i++){
        scanf("%d", &temp);
        num[temp] = 1;
    }
    if(m == 10){
        printf("%d", from100);
        return 0;
    }
    while(1){
        for(int i = 0; i < 2; i++){
            if(n+cnt*d[i] < 0) continue;
            s = to_string(n+cnt*d[i]);
            for(int i = 0; i < s.size(); i++){
                if(num[s[i]-'0']) {
                    s[0] = '-';
                    break;
                }
            }
            if(s[0]!= '-'){
                if(cnt + s.size() < from100)printf("%lu", cnt + s.size());
                else printf("%d", from100);
                return 0;
            }
        }
        cnt++;
    }
}

느낀점

  • 만약 실제 문제에서 이런걸 발견하면 더 나은 방법을 계속해서 고민할 것 같다.
  • 효율적인 방법을 생각하다가 막히면 최대한 단순한 방법을 빨리 생각해내야겠다.