https://www.acmicpc.net/problem/14226
14226번: 이모티콘
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다. 영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만
www.acmicpc.net
문제
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다.
영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만들어 보려고 한다.
- 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
- 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다.
- 화면에 있는 이모티콘 중 하나를 삭제한다.
모든 연산은 1초가 걸린다. 또, 클립보드에 이모티콘을 복사하면 이전에 클립보드에 있던 내용은 덮어쓰기가 된다. 클립보드가 비어있는 상태에는 붙여넣기를 할 수 없으며, 일부만 클립보드에 복사할 수는 없다. 또한, 클립보드에 있는 이모티콘 중 일부를 삭제할 수 없다. 화면에 이모티콘을 붙여넣기 하면, 클립보드에 있는 이모티콘의 개수가 화면에 추가된다.
영선이가 S개의 이모티콘을 화면에 만드는데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 S (2 ≤ S ≤ 1000) 가 주어진다.
출력
첫째 줄에 이모티콘을 S개 만들기 위해 필요한 시간의 최솟값을 출력한다.
#include <iostream>
#include <queue>
using namespace std;
int S;
bool visit[1001][1001];
int bfs()
{
queue<pair<pair<int,int>,int>> q;
q.push(make_pair(make_pair(1,0),0));
while (!q.empty())
{
int nowPos = q.front().first.first;
int clip = q.front().first.second;
int time = q.front().second;
q.pop();
if (nowPos == S)
return time;
if (nowPos > 1 && nowPos < 1001)//-1
{
if (!visit[nowPos - 1][clip])
{
visit[nowPos - 1][clip] = true;
q.push(make_pair(make_pair(nowPos - 1, clip), time+1));
}
}
if (nowPos > 0 && nowPos < 1001)//클립보드 저장
{
if (!visit[nowPos][nowPos])
{
visit[nowPos][nowPos] = true;
q.push(make_pair(make_pair(nowPos, nowPos), time + 1));
}
}
if (nowPos + clip < 1001 && clip>0)//클립보드 복사
{
if (!visit[nowPos + clip][clip])
{
visit[nowPos + clip][clip] = true;
q.push(make_pair(make_pair(nowPos + clip, clip), time + 1));
}
}
}
}
int main()
{
cin >> S;
cout<<bfs();
}
'백준 c++ > (1-2)백준 c++ 알고리즘 기초' 카테고리의 다른 글
백준 1261 c++ 알고스팟 (0) | 2022.09.17 |
---|---|
백준 13549 c++ 숨바꼭질 3 (0) | 2022.09.14 |
백준 13913 c++ 숨바꼭질 4 (0) | 2022.09.12 |
백준 1697 c++ 숨바꼭질 (0) | 2022.09.11 |
백준 16964 c++ DFS 스페셜 저지 (0) | 2022.09.05 |