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

[BOJ / c++] 1107번 - 리모컨

알 수 없는 사용자 2022. 1. 11. 18:49

링크

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

 

1107번: 리모컨

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

www.acmicpc.net

풀이

채널 N으로 이동할 때 100번에서 +, - 로만 이동하는 방법과 고장나지 않은 버튼으로 누를 수 있는 번호를 누르고 필요시 +, -로 이동하는 방법 중 최소의 값을 구했습니다.

처음 제출할 때 초기 ans값을 초기화 하는 과정에서 아무 생각 없이 0으로 잡아 틀렸는데 문제를 풀 때 멍때리지 말고 차근 차근 생각하면서 풀어야 겠다고 느꼈습니다 (자의적인 해석 ❌ 문제 꼼꼼히 읽기 ⭕)

코드

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

bool broken[10]; // 고장난 버튼 체크

int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        int b;
        cin >> b;
        broken[b] = true;
    }
    int ans = -987654321;
    int size = 9;
    for (int i = 0; i < pow(10, 6); i++) {
        string s = to_string(i);
        bool flag = true; // 고장난 버튼을 누르지 않아도 되면 true, 눌러야 하면 false
        for (int i = 0; i < s.size(); i++) {
            if (broken[s[i] - '0']) flag = false;
        }
        if (flag) {
            if (abs(i - n) + s.size() < abs(ans - n) + size) {
                ans = i;
                size = s.size();
            }
        }
    }
    cout << min(abs(n - 100), abs(ans - n) + size); // 100번에서 +,-를 누르는 경우와 번호를 누른 후 +, -를 누르는 경우 중 최소값
    return 0;
}