문제
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다.
영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만들어 보려고 한다.
- 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
- 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다.
- 화면에 있는 이모티콘 중 하나를 삭제한다.
모든 연산은 1초가 걸린다. 또, 클립보드에 이모티콘을 복사하면 이전에 클립보드에 있던 내용은 덮어쓰기가 된다. 클립보드가 비어있는 상태에는 붙여넣기를 할 수 없으며, 일부만 클립보드에 복사할 수는 없다. 또한, 클립보드에 있는 이모티콘 중 일부를 삭제할 수 없다. 화면에 이모티콘을 붙여넣기 하면, 클립보드에 있는 이모티콘의 개수가 화면에 추가된다.
영선이가 S개의 이모티콘을 화면에 만드는데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 S (2 ≤ S ≤ 1000) 가 주어진다.
출력
첫째 줄에 이모티콘을 S개 만들기 위해 필요한 시간의 최솟값을 출력한다.
문제 해결
문제에서 주어진 각 연산에서 필요로 하는 조건 설정에 유의해야 한다.
1. 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
→ 화면에 출력된 이모티콘의 개수가 1개 이상이어야 한다.
2. 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다.
→ 클립보드에 저장된 이모티콘의 개수가 1개 이상이어야 한다.
3. 화면에 있는 이모티콘 중 하나를 삭제한다.
→ 화면에 출력된 이모티콘의 개수가 1개 이상이어야 한다.
실행시간 단축을 위해 bool형 2차원 배열 visit을 선언하여 관리한다. visit[i][j]에는 현재 화면에 보여지는 이모티콘의 개수가 i개, 클립보드에 저장된 이모티콘의 개수가 j개일 때 해당 상황을 방문한 적이 있는지 저장한다.
코드
#include <iostream>
#include <queue>
using namespace std;
#define MAX 2000
queue<pair<int, int>> q;
queue<int> c;
int s;
bool visit[MAX][MAX];
int bfs() {
visit[1][0] = 1;
q.push({ 1,0 });
c.push(0);
while (!q.empty()) {
int disp = q.front().first, clip = q.front().second;
int cnt = c.front();
q.pop(); c.pop();
if (disp == s) return cnt;
if (disp > 0 && disp <MAX) {
// 1. 화면에 있는 이모티콘을 모두 클립보드로 복사하는 연산
if (!visit[disp][disp]) {
visit[disp][disp] = 1;
q.push({ disp, disp });
c.push(cnt + 1);
}
// 3. 화면에 있는 이모티콘 중 하나를 삭제하는 연산
if (!visit[disp - 1][clip]) {
visit[disp - 1][clip] = 1;
q.push({ disp - 1, clip });
c.push(cnt + 1);
}
}
// 2. 클립보드에 있는 모든 이모티콘을 화면에 붙여넣는 연산
if (clip && disp + clip < MAX) {
if (!visit[disp + clip][clip]) {
visit[disp + clip][clip] = 1;
q.push({ disp + clip,clip });
c.push(cnt + 1);
}
}
}
return 0;
}
int main() {
cin >> s;
cout << bfs();
}
'🎲 BOJ > 🥇' 카테고리의 다른 글
[C++] 백준 1072 : 게임 (0) | 2022.02.08 |
---|---|
[C++] 백준 2533 : 사회망 서비스(SNS) (0) | 2022.02.07 |
[C++] 백준 2206 : 벽 부수고 이동하기 (0) | 2022.01.30 |
[C++] 백준 7579 : 앱 (0) | 2022.01.30 |