리모컨 (1107)
풀이코드
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
using namespace std;
// 1107 리모컨
const int MAX = 1000000;
bool controller[10];
int checkButton(int button){
if(button == 0){
if(!controller[0]) return 0;
else return 1;
}
int count = 0;
while(button > 0){
if(controller[button % 10] == false)
return 0;
button /= 10;
count++;
}
return count;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int channel;
int M;
cin >> channel;
cin.ignore();
cin >> M;
fill_n(controller, 10, true);
for(int i = 0 ; i < M; i++){
int tmp;
cin >> tmp;
controller[tmp] = false;
}
// 숫자를 누르지 않아도 될 때를 초기값으로 갖음.
int count = abs(channel - 100);
int closestChannel = 0;
for(int i = 0; i <= MAX; i++){
int len = checkButton(i);
if(len > 0){
int currentDiff = abs(channel - i);
if(len + currentDiff < count){
count = len + currentDiff;
}
}
}
cout << count << '\n';
return 0;
}
해설
적용한 레시피 / 방법론 + 접근법
풀이
아쉬웠던 부분 / 오답 원인 / 개선해야 할 점
- 혼자 푸는데 1시간을 소모하지 않기로 했는데, 이 문제는 1시간을 넘게 붙잡고 있었던 듯 하다. 전역 배열이며 해당 인덱스의 버튼이 고장났는지 나지 않았는지를 알고 있는 bool 배열 controller 의 초기화를 하지 않아서 생긴 오류를 발견하기 전까지 붙잡고 있었다. fill_n 을 사용하여 배열을 원하는 대로 명확히 초기화 하도록 하자.
- 강의를 보며 추가적으로 배운 점들
1. 예외 처리가 생각보다 많다.
input 의 범위는 500,000 만이 최대이지만 가능한 채널은 무한이다. 이 점에서 예외 처리를 하나 해주어야 하는데, 바로 브루트 포스 시행 시 1,000,000 까지 하는 것이다. 범위를 초과한 채널에서 - 하는 것이 더 빠를 수 있기 때문이다.
2. 문제를 잘못 읽어서 발생한 오류
시작 채널이 100 이라는 것을 인지하지 못하고 문제에 돌입하여 사소하지만 중요한 오류가 발생하였다.
0 에 도달하면 끝이라는 것이 문제에 명시되어 있음에도 프로그램에 구현하지 않았었다.
반응형
'ps > 브루트 포스' 카테고리의 다른 글
6064 카잉 달력 (0) | 2021.08.22 |
---|---|
14500 테트로미노 (0) | 2021.08.22 |
3085 사탕 게임 (0) | 2021.08.21 |
2309 일곱 난쟁이 (0) | 2021.08.21 |
11726 (0) | 2021.07.10 |