득이공간

[백준 C++] 1107 리모컨 - 브루트포스 본문

PS/알고리즘 문제풀이

[백준 C++] 1107 리모컨 - 브루트포스

쟁득 2024. 2. 17. 12:17
 

1107번: 리모컨

첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼이

www.acmicpc.net

cpp
#include <iostream> #include <string> using namespace std; int N, M, C; bool Broken[10]; bool IsPossible(string CurrentChannel, int Size) { for (int i = 0; i < Size; ++i) { ‌‌int Number = CurrentChannel[i] - '0'; ‌‌if (Broken[Number]) ‌‌{ ‌‌‌return false; ‌‌} } return true; } int CountPush(int Target) { int Push = 1000000; for (int Current = 0; Current <= 1000000; ++Current) { ‌‌string CurrentChannel = to_string(Current); ‌‌int Size = CurrentChannel.size(); ‌‌if (!IsPossible(CurrentChannel, Size)) ‌‌{ ‌‌‌continue; ‌‌} ‌‌Push = min(Push, abs(Target - Current) + Size); } return Push; } int main() { ‌ios::sync_with_stdio(false); ‌cin.tie(NULL); cout.tie(NULL); ‌cin >> N >> M; for (int i = 0; i < M; ++i) { ‌‌int Button; ‌‌cin >> Button; ‌‌Broken[Button] = true; } ‌cout << min(abs(N - 100), CountPush(N)); }

브루트포스 알고리즘 유형의 문제입니다.

다음 두 가지 상황 중에 더 작은 값을 선택하도록 해서 풀었습니다.

 

1. 현재 채널(100)에서 목표 채널(N)까지 +,- 버튼만 사용했을 때의 횟수: abs(N - 100)

2. 숫자 버튼 입력 후 +, - 버튼 사용을 통해 목표 채널까지 이동했을 때의 횟수

 

2번 단계에서는 숫자 버튼으로 입력한 채널로 0부터 1000000까지 모두 탐색해줍니다.

그리고 각 채널 마다 숫자 버튼으로 입력 가능한지 확인한 후,

입력 가능하다면 +,-로 이동하는 횟수{abs(목표채널 - 해당 채널)} + 숫자 버튼 입력 횟수{해당 채널의 길이}를 구해주고

그 중 가장 작은 값을 출력하도록 해줍니다.