문제
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다.
영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만들어 보려고 한다.
- 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
- 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다.
- 화면에 있는 이모티콘 중 하나를 삭제한다.
모든 연산은 1초가 걸린다. 또, 클립보드에 이모티콘을 복사하면 이전에 클립보드에 있던 내용은 덮어쓰기가 된다. 클립보드가 비어있는 상태에는 붙여넣기를 할 수 없으며, 일부만 클립보드에 복사할 수는 없다. 또한, 클립보드에 있는 이모티콘 중 일부를 삭제할 수 없다. 화면에 이모티콘을 붙여넣기 하면, 클립보드에 있는 이모티콘의 개수가 화면에 추가된다.
영선이가 S개의 이모티콘을 화면에 만드는데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 S (2 ≤ S ≤ 1000) 가 주어진다.
출력
첫째 줄에 이모티콘을 S개 만들기 위해 필요한 시간의 최솟값을 출력한다.
풀이과정
1. BFS 를 이용하여 문제를 해결했습니다.
2. 화면하고 클립보드가 두 개에 이모티콘을 옮겨 가며 목표 개수를 만드는 문제입니다.
그래서 방문을 확인하는 bool 값 2차원 배열을 선언하여 이모티콘 내용을 탐색했습니다.
3. 이모티콘을 움직이는 조건에 따라 탐색을 진행하였습니다.
이모티콘 움직이기 조건
[1. 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.]
if (!visit[screen][screen])
{
q.push(make_pair(time + 1,make_pair(screen,screen)));
visit[screen][screen] = true;
}
[2. 클립보드에 있는 모든 이모티콘을 화면에 붙여 넣기 한다.]
if (screen + clip <= S && !visit[screen + clip][clip])
{
q.push(make_pair(time + 1, make_pair(screen + clip, clip)));
visit[screen + clip][clip] = true;
}
[3. 화면에 있는 이모티콘 중 하나를 삭제한다.]
if (screen - 1 >= 0 && !visit[screen - 1][clip])
{
q.push(make_pair(time + 1, make_pair(screen - 1, clip)));
visit[screen - 1][clip] = true;
}
4. 이모티콘 개수가 S개가 될 경우 BFS 탐색을 종료하고 결과를 출력했습니다.
코드
#include<iostream>
#include<vector>
#include<queue>
#define endl "\n"
using namespace std;
#define MAX 1001
bool visit[MAX][MAX];
int BFS(int S)
{
queue<pair<int,pair<int, int>>> q;
q.push(make_pair(0,make_pair(1, 0)));
visit[1][0] = true;
while (!q.empty())
{
int time = q.front().first;
int screen = q.front().second.first;
int clip = q.front().second.second;
q.pop();
if (screen == S)
return time;
if (!visit[screen][screen])
{
q.push(make_pair(time + 1,make_pair(screen,screen)));
visit[screen][screen] = true;
}
if (screen + clip <= S && !visit[screen + clip][clip])
{
q.push(make_pair(time + 1, make_pair(screen + clip, clip)));
visit[screen + clip][clip] = true;
}
if (screen - 1 >= 0 && !visit[screen - 1][clip])
{
q.push(make_pair(time + 1, make_pair(screen - 1, clip)));
visit[screen - 1][clip] = true;
}
}
}
void Answer()
{
int S;
cin >> S;
cout << BFS(S) << endl;
}
int main()
{
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
Answer();
return 0;
}