Koala - 15기/코딩테스트 준비 스터디

[백준/C++] 1107번: 리모컨

.우디. 2024. 8. 4. 18:39

문제 & 링크

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

 

풀이

1. 리모컨은 0 - 9까지 10개의 버튼을 가지고 있기에 길이가 10인 bool 자료형의 배열을 만들고, 입력받은 버튼을 true로 설정한다.

2. 현재 채널이 100이기에 +, - 버튼만으로 원하는 채널에 도달할 때 누르는 횟수를 저장한다. 이때 음수값을 가질 수도 있으니 abs() 함수를 이용하여 양수로 저장한다.

3. 이동하고자 하는 채널이 최대 500,000번 이기에 1,000,000번 채널에서 - 버튼을 누르는 경우도 생각하여 반복문을 수행한다.

4. 해당 채널의 번호가 부서진 버튼을 포함하고 있는지 check 함수를 통해 확인한다. 이때 채널 번호를 string 형태로 바꾸고 한 글자 단위로 확인한다.

5. 만약 채널 번호를 누를 수 있는 경우(check 함수를 통과한 경우), 해당 채널의 자릿수 + N 까지의 거리(+, - 버튼으로 이동하는 거리)를 수행하고 최솟값을 구해준다.

 

코드

#include <iostream>
#include <string>

using namespace std;

bool broken[10] = { false };

bool check(int num) {
    string S = to_string(num);

    for (int i = 0; i < S.length(); i++) {
        if (broken[S[i] - '0']) return false;
    }

    return true;
}

int main() {
    int N, M;
    int num;

    cin >> N;
    cin >> M;

    for (int i = 0; i < M; i++) {
        cin >> num;
        broken[num] = true;
    }

    int min = abs(N - 100);

    for (int i = 0; i <= 1000000; i++) {
        if (check(i)) {
            int tmp = to_string(i).length() + abs(N - i);
            if (min > tmp) min = tmp;
        }
    }

    cout << min;
}