본문 바로가기
Programming Solve/BOJ

BOJ 1107 - 리모컨 / C++

by msm1029 2022. 4. 21.
반응형

문제 링크 : https://www.acmicpc.net/problem/1107

 

1107번: 리모컨

첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다.  둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼

www.acmicpc.net

 

 

풀이

우선 0~9까지 숫자 배열을 bool값으로 만들어놓고 사용할 수 있는 값은 true, 아니라면 false로 설정해둔다.

 

구하고자 하는 채널 번호가 100이라면, 시작 번호가 100이므로 이동하지 않아도 된다. 따라서 0을 출력하고 종료한다.

아니라면 직접 구해야한다.

 

우선, + 또는 -만 눌러서 이동 가능한 값은 100 - target의 절댓값으로 구할 수 있다.

다음으로 채널을 누른 뒤 + 또는 -를 눌러 이동 가능한 값은 직접 0부터 100만까지 돌며 구해야한다.

 

이 과정에서 사용할 수 없는 버튼이 존재하는지 check 함수를 구현하여 확인한다.

모두 사용할 수 있는 버튼으로 이루어져있다면 해당 값의 크기와 이동 횟수를 더해서 앞서 구한 값과 비교하여

최솟값을 갱신한다.

 

코드

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

bool buttons[10] = { true, true, true, true, true, true, true, true, true, true };

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

    for(int i=0; i<strNum.size(); i++){
        if(buttons[strNum[i] - '0'] == false) return false;
    }

    return true;
}

int main(){
    int target, n, ans = 0;

    cin >> target >> n;
    if(target == 100){
        cout << 0;
        return 0;
    }

    for(int i=0; i<n; i++){
        int tmp;
        cin >> tmp;
        buttons[tmp] = false;
    }

    ans = abs(target - 100);

    for(int i=0; i<=1000000; i++){
        if(check(i)){
            int tmp = abs(target - i) + to_string(i).size();
            ans = min(ans, tmp);
        }
    }

    cout << ans;
}
반응형

'Programming Solve > BOJ' 카테고리의 다른 글

BOJ 9375 - 패션왕 신해빈 / C++  (0) 2022.05.01
BOJ 10464 - XOR / C++  (0) 2022.04.21
BOJ 1074 - Z / C++  (0) 2022.04.21
BOJ 16928 - 뱀과 사다리 게임 / C++  (0) 2022.04.18
BOJ 18870 - 좌표 압축 / C++  (0) 2022.04.17