Search
Duplicate

리모컨

주차
0주차
문제번호
1107
언어
티어
골드
유형
nj_Blog
nj_상태
이해도
풀이
사람
이해도 2
13 more properties
접근 방법
처음 접근했던 방법은, 브루트포스로 풀기 보다는 리모콘으로 최대한 그 채널과 근접하게 이동 후에 채널의 차이를 구하는 방식으로 생각했습니다. 또한 이동하려는 채널보다 큰 값과 작은 값 두 부분으로 나누어서 계산하려고 했습니다. 예를 들어, 이동하려는 채널의 번호가 2333 이라고 하면 2,3의 버튼이 고장 났다고 가정할때 3000가 큰 값, 1999가 작은 값이라 생각하고 코드를 작성했습니다. 하지만 이 방법의 문제점은 999 와 같은 값을 원하는 채널로 받았을때 예외케이스가 많이 발생한다는 것이었습니다. 가령 8과 9의 채널이 고장났다면 999보다 큰 값인 1000 을 찾아내야 하는데 그 값을 계산하기 위해서는 결국 브루트포스로 찾아낼 수 밖에 없다는 생각이 들었습니다.
브루트포스 방식으로 계산할 경우 N의 최대값은 500,000이므로 (10의 6승 * 계산하는 각 숫자의 자릿수의 합)이 시간복잡도로 나왔습니다. 따라서 다른 기법을 사용하지 않고 브루트포스를 이용하여 정답을 찾아낼 수 있었습니다.
#include <iostream> #include <vector> #include <cstdlib> int N, M; std::vector<int> b_channel; int c_min, c_size; void input_faster() { std::ios_base::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); } void input() { int tmp; input_faster(); std::cin >> N >> M; b_channel.resize(10, 1); for (int i = 0 ; i < M; i++) { std::cin >> tmp; b_channel[tmp] = 0; } } int is_possible(int n) { c_size++; if (n <= 9) { if (b_channel[n]) return (1); else return (0); } if (is_possible(n / 10)) { if (b_channel[n % 10]) return (1); } return (0); } void print_val() { std::cout << c_min; } void solve() { c_min = std::abs(N - 100); for (int i = 0 ; i <= 1000000 ; i++) { c_size = 0; if (is_possible(i)) if (std::abs(N - i) + c_size < c_min) c_min = std::abs(N - i) + c_size; } } int main() { input(); solve(); print_val(); return (0); }
C++
복사