오답을 유발하는 가장 큰 원인은 바로
'첫째 줄에 수빈이가 이동하려고 하는 채널 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;
}
'백준' 카테고리의 다른 글
[프로그래머스] 개인정보 수집 유효기간 C++ (0) | 2024.03.28 |
---|---|
[C++] 1012번 (유기농 배추) (0) | 2023.07.08 |
[C++] 1331번 (나이트 투어) (0) | 2023.05.07 |
[C] 백준 1003번 (피보나치 함수) (0) | 2023.04.11 |
[C] 백준 2579번 (계단 오르기) (0) | 2023.04.10 |
댓글