티스토리 뷰

프로그래밍/문제풀이

[BOJ] 1107 리모컨

Jaerae Kim 2020. 5. 20. 20:05
#include <stdio.h>
#include <math.h>

int remote[10];

int min(int a, int b)
{
    return a < b ? a : b;
}

int possible(int a) {
    int i, j, ab, digit;
    int result = 0;

    ab = a;
    while (1) {
        digit = ab % 10;
        if (remote[digit] == -1) {
            result = 0;
            break;
        }
        if (ab < 10) {
            result += 1;
            break;
        }
        ab /= 10;
        result++;
    }
    return result;
}

int main(void)
{
    int i, n, m, x, digit, MAX;
    int MIN = 987654321;

    scanf("%d", &n);
    scanf("%d", &m);
    for (i = 0; i < m; i++) {
        scanf("%d", &x);
        remote[x] = -1;
    }
    if (n < 100)
        MAX = 100;
    else
        MAX = n;

    for (i = 0; i <= MAX * 2; i++) {
        digit = possible(i);
        if (digit != 0 && digit < abs(i - 100))
            MIN = min(MIN, digit + abs(n - i));
        else
            MIN = min(MIN, abs(i - 100) + abs(n - i));
    }
    printf("%d", MIN);

    return 0;
}

디버깅할 때 좀 재밌었다.
처음엔 n보다 큰 수에서 n으로 내려올 생각을 못했고 입력 예에 대해 생각하다 우연히 떠올랐다.
문제를 많이 풀어봐야 한다는 말이 이해가 됐다. 이번엔 운이 좋아서 금방 생각났지만 늘 그런건 아니다. 이런 풀이 방식을 많이 알아두는 게 제한 시간 안에 맞추기엔 도움이 되겠지.
기억하려고 적어둔다.

'프로그래밍 > 문제풀이' 카테고리의 다른 글

[BOJ] 10799 쇠막대기  (0) 2020.06.13
[BOJ] 14891 톱니바퀴  (0) 2020.05.20
[BOJ] 10971 외판원 순회2  (0) 2020.05.15
[BOJ] 11051 이항 계수 2  (0) 2020.02.28
[BOJ] 11057 오르막 수  (0) 2020.02.27
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   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
글 보관함