탈출
| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 1 초 | 256 MB | 3771 | 1257 | 1011 | 32.331% |
문제
홍익이는 홍익대학교 프로그래밍 경진대회의 출제진이다.
홍익이는 새벽에 문제를 만들던 도중 뒤통수에 느껴지는 고통과 함께 정신을 잃었다.
홍익이는 좁은 방에서 눈을 떴다.
주변을 살펴보니 벽면에는 LED로 된 다섯 자리 십진수 N이, 그 옆에 T, G라는 알파벳과 함께
또 다른 정수 두 개가 쓰여 있었고, 벽 앞에는 버튼 A, B 두 개가 있었다.
버튼을 이리저리 눌러보던 똑똑한 홍익이는 어떻게 해야 방을 탈출할 수 있을지 금방 눈치챘다.
버튼과 수에 대해 홍익이가 알아낸 것은 다음과 같다.
- 버튼 A를 누르면 N이 1 증가한다.
- 버튼 B를 누르면 N에 2가 곱해진 뒤, 0이 아닌 가장 높은 자릿수의 숫자가 1 줄어든다.
예를 들어 123→146으로, 5→0으로, 3→5로 변한다.
단, N이 0이면 버튼 B를 눌러도 수가 변하지 않는다. - LED가 다섯 자리까지밖에 없기 때문에 N이 99,999를 넘어가는 순간 탈출에 실패하게 된다.
- 버튼 B를 눌러 N에 2를 곱한 순간 수가 99,999를 넘어간다면,
높은 자릿수의 수를 1 낮췄을때 99,999를 넘지 않는다고 해도 탈출에 실패하게 된다.
또한 홍익이는 최대 T회 버튼을 누를 수 있고,
그 횟수 안에 LED로 표현된 N을 G와 같게 만들어야 탈출할 수 있다는 사실을 알아냈다.
똑똑한 홍익이는 이와중에 자존심이 발동해 버튼 누르는 횟수를 최소로 하여 방을 탈출하기로 했다.
홍익이의 방 탈출을 기원하며, 탈출에 필요한 최소의 버튼 횟수를 구하자.
입력
첫 번째 줄에 N (0 ≤ N ≤ 99,999), T (1 ≤ T ≤ 99,999), G (0 ≤ G ≤ 99,999)가
공백 하나를 사이에 두고 주어진다.
각각 N은 LED로 표현된 수, T는 버튼을 누를 수 있는 최대 횟수,
G는 탈출을 위해 똑같이 만들어야 하는 수를 뜻한다.
출력
첫 번째 줄에 탈출에 필요한 최소의 버튼 횟수를 출력한다.
만약 탈출할 수 없다면 “ANG”을 따옴표 없이 출력한다.
예제 입력 1
1 7 10
예제 출력 1
7
버튼을 A A A B A A A 순서로 누르면
1 -> 2 -> 3 -> 4 -> 7 -> 8 -> 9 -> 10 순서로 숫자가 변한다.
예제 입력 2
7142 10 7569
예제 출력 2
3
예제 입력 3
7142 1 7569
예제 출력 3
ANG
예제 입력 4
63429 99999 231
예제 출력 4
ANG
출처
University > 홍익대학교 > 2018 홍익대학교 컴퓨터공학과 코딩대회 D번
알고리즘 분류
BFS를 이용하여 해결
삽질을 엄청 많이 했다.
통과된 코드
#include <iostream>
#include <queue>
using namespace std;
int N, T, G;
// N: LED의 숫자, T: 버튼을 누를 수 있는 횟수, G: 목표 숫자
int result = 0;
// 결과
bool failConditionCheck = true;
// 조건을 벗어날 경우 true;
queue<int> myQ;
//BFS에서 사용한 queue
#define MAX 100000
int check[MAX];
// 버튼 A 기능의 함수
int BtnA(int number)
{
number += 1;
return number;
}
// 버튼 B 기능의 함수
int BtnB(int number)
{
number *= 2;
int i = 10000;
while (i >= 1)
{
if (number / i != 0)
{
number -= i;
break;
}
i = i / 10;
}
return number;
}
// 초기화 함수
void Initialization()
{
cin >> N >> T >> G;
//배열 초기화
for (int i = 0; i < MAX; i++)
{
check[i] = 0;
}
}
// BFS 기능의 함수
void BFS(int N)
{
myQ.push(N);
while (!myQ.empty())
{
int a = myQ.front();
myQ.pop();
// 방문한 적이 있거나 실행 횟수가 T를 넘어가면 스킵
if (check[a] > T)
{
continue;
}
if (a == G)
{
failConditionCheck = false;
}
for (int i = 0; i < 2; i++)
{
int temp = 0;
switch (i)
{
case 0:
if (a >= 99999)
{
break;
}
temp = BtnA(a);
if (check[temp] == 0)
{
myQ.push(temp);
check[temp] = check[a] + 1;
}
break;
case 1:
if (a > 49999)
{
break;
}
temp = BtnB(a);
if (check[temp] == 0)
{
myQ.push(temp);
check[temp] = check[a] + 1;
}
break;
}
}
}
}
int main()
{
Initialization();
BFS(N);
if (failConditionCheck)
{
cout << "ANG";
}
else
{
result = check[G];
cout << result;
}
return 0;
}


![Programmers 17681 [1차] 비밀지도 [2018 KAKAO BLIND RECRUITMENT]](https://lycos7560.com/wp-content/uploads/2023/03/programmers.jpg)
![백준 17626번 (Four Squares 4, C++, DP) [BAEKJOON]](https://lycos7560.com/wp-content/uploads/boj-og-1.png)