https://www.acmicpc.net/problem/1107
이 문제는 브루트 포스 문제이다 범위가 500000으로 확정되었기 때문에 특정 범위 안에 있는 수들이 조건이 맞는지만 판별해주면 되는 분제였다 나는 수빈이가 이동하려는 범위의 2배를 채널 선택의 범위로 정하였다.
일단 나는 수빈이가 선택하려는 채널을 기준으로 증가하는 채널과 감소하는 채널 2개를 선택해 2개중에 더 작은 값을 사용하는 방법을 사용하였다
위 그림처럼 변수 psearch와 nsearch를 만들어
수빈이가 선택한 채널을 기준으로 더큰채널과 더작은 채널 중 증가와 감소로 접근할 수 있는 범위를 찾고 자릿수 입력도 입력수에 포함하기 때문에 +-버튼 클릭수와 채널의 자릿수를 더해서 비교후 더 작은값을 저장해준다.
여기에서 추가로 또 예외처리 해줘야 할게 있는데
수빈이의 채널이 100부터 시작하기에 만약 채널이 100부터 시작했을 때 더 가까울 경우도 생각해주어야 한다.
해당 그림을 통해 구현한 코드는 아래와 같다
#include<iostream>
#include<stdlib.h>
int N,M;
bool arr[10];
int psearch = 1000000;
int nsearch = 1000000;
int hsearch;
using namespace std;
int solution(int n) {
if (n < 10) {
if (!arr[n]) {
return 1;
}
}
else if (n < 100) {
if (!arr[n / 10] && !arr[n % 10]) {
return 2;
}
}
else if (n < 1000) {
if (!arr[n/100] && !arr[n%100 / 10] && !arr[n % 10]) {
return 3;
}
}
else if (n < 10000) {
if (!arr[n/1000] && !arr[n%1000 / 100] && !arr[n%100 / 10] && !arr[n % 10]) {
return 4;
}
}
else if (n < 100000) {
if (!arr[n / 10000] && !arr[n%10000 / 1000] && !arr[n%1000 / 100] && !arr[n%100 / 10] && !arr[n % 10]) {
return 5;
}
}
else if(n<1000000){
if (!arr[n / 100000] && !arr[n%100000 / 10000] && !arr[n%10000 / 1000] && !arr[n%1000 / 100] && !arr[n%100 / 10] && !arr[n % 10]) {
return 6;
}
}
return false;
}
int main() {
cin >> N >> M;
int searchNum1,searchNum2;
int answer = 0;
for (int i = 0; i < M; i++) {
int temp;
cin >> temp;
arr[temp] = true;
}
searchNum1 = N;
searchNum2 = N;
while (true) {
if (solution(searchNum1) && (searchNum1 >= 0)) {
psearch = solution(searchNum1) + (N - searchNum1);
break;
}
searchNum1--;
if (searchNum1 < 0)
break;
}
while (true) {
if (solution(searchNum2) && (searchNum1 <=1000000)) {
nsearch = solution(searchNum2) + (searchNum2-N);
break;
}
searchNum2++;
if (searchNum2 > 1000000)
break;
}
hsearch = abs(N - 100);
if (psearch > nsearch) {
answer = nsearch;
}
else {
answer = psearch;
}
if (answer > hsearch) {
answer = hsearch;
}
cout << answer;
}