본문으로 바로가기

리모컨 1107

category ps/브루트 포스 2021. 8. 22. 11:30

리모컨 (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