본문 바로가기
백준

[C++] 백준 1107 (리모컨)

by 감조자림 2023. 8. 8.

오답을 유발하는 가장 큰 원인은 바로

'첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다.' 

라는 문구 때문이 아닐까 싶다.

저 문장을 보고 티비채널은 0 ~ 500,000 까지 있구나 라고 생각할 수 있지만 문제에도 나와있듯 채널번호는 무한대이다.

즉 500,000 보다 더 큰 번호의 채널로 간 뒤에 채널을 아래로 내려서 원하는 채널을 맞출수도 있다는 것. 

따라서 채널이 1,000,000 번 까지 있다고 생각하고 풀어야 된다. (정확히는 999,900)

0 ~ 1,000,000 채널 중에 고장난 숫자를 포함한 채널은 0을 반환해서 버리고, 작동하는 숫자버튼을 이용해서 갈 수 있는 채널에서 TargetChannel (수빈이가 이동하려고 하는 채널) 을 빼서 리모컨의 +, - 버튼을 몇 번 눌러야하는지 구한다.
(거기에 숫자버튼을 누른 횟수 ( = CanGoDirect함수의 리턴값) 까지 더해준다.)

그 중 가장 적게 누르는 녀석을 Result에 넣는다.

#include <iostream>
#include <cmath>

bool BrokenButton[10]; // 고장나면 true 고장 안 나면 false. 기본은 false.

int CanGoDirect(int ChannelNum) {
	int Len = 0;
	if (ChannelNum == 0) {
		if (BrokenButton[0]) return 0;
		else return 1;
	}

	while (ChannelNum > 0) {
		if (BrokenButton[ChannelNum % 10]) return 0;
		else Len++;

		ChannelNum /= 10;		
	}

	return Len;
}

int main() {	
	int TargetChannel, BrokenButtonNum, ButtonIdx, Result;
	std::cin >> TargetChannel >> BrokenButtonNum;
	Result = abs(100 - TargetChannel);

	if (BrokenButtonNum > 0) {
		for (int i = 0; i < BrokenButtonNum; i++) {
			std::cin >> ButtonIdx;
			BrokenButton[ButtonIdx] = true;			
		}
		
	}

	for (int i = 0; i < 1000000; i++) {
		if (!CanGoDirect(i)) continue;
		if (abs(i - TargetChannel) + CanGoDirect(i) < Result) Result = abs(i - TargetChannel) + CanGoDirect(i);
	}

	std::cout << Result;

	return 0;	
	
}

 

 

댓글