문제
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다.
영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만들어 보려고 한다.
- 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
- 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다.
- 화면에 있는 이모티콘 중 하나를 삭제한다.
모든 연산은 1초가 걸린다. 또, 클립보드에 이모티콘을 복사하면 이전에 클립보드에 있던 내용은 덮어쓰기가 된다. 클립보드가 비어있는 상태에는 붙여넣기를 할 수 없으며, 일부만 클립보드에 복사할 수는 없다. 또한, 클립보드에 있는 이모티콘 중 일부를 삭제할 수 없다. 화면에 이모티콘을 붙여넣기 하면, 클립보드에 있는 이모티콘의 개수가 화면에 추가된다.
영선이가 S개의 이모티콘을 화면에 만드는데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 S (2 ≤ S ≤ 1000) 가 주어진다.
출력
첫째 줄에 이모티콘을 S개 만들기 위해 필요한 시간의 최솟값을 출력한다.
예제 입력 1 복사
2
예제 출력 1 복사
2
예제 입력 2 복사
4
예제 출력 2 복사
4
예제 입력 3 복사
6
예제 출력 3 복사
5
예제 입력 4 복사
18
예제 출력 4 복사
8
bfs를 이용해서 풀 수 있었다.
특이한 점은 visit[][]를 통해서 각 count값의 상태를 저장하고 그 상태에 방문을 했으면 continue를 해 줘야 큐의 대기열로 인한 메모리 초과를 막을 수 있다.
+ visit의 최대 값을 1000으로 하는 것이 아니라 더 큰 값을 넣어서 초기화를 해야 segfault 에러가 나지 않는다. 아마도 for문을 통해서 1,2,3번 연산을 결정할 때 훨씬 더 많은 값이 들어가서 에러가 발생하는 듯 하니 주의하자.
- c++ 풀이
#include <bits/stdc++.h>
#define visit trash
using namespace std;
int s;
bool visit[9999][9999];
int bfs() {
queue<pair<pair<int, int>, int>> q;
q.push({{1, 0}, 0});
while (!q.empty()) {
int nowScreenEmojiCount = q.front().first.first;
int nowClipboardEmojiCount = q.front().first.second;
int nowTime = q.front().second;
q.pop();
if (visit[nowScreenEmojiCount][nowClipboardEmojiCount] == true) {
continue;
}
visit[nowScreenEmojiCount][nowClipboardEmojiCount] = true;
// cout << nowScreenEmojiCount << " " << nowClipboardEmojiCount << " " << nowTime << "\n";
if (nowScreenEmojiCount == s) {
return nowTime;
}
int newScreenEmojiCount = 0;
int newClipboardEmojiCount = 0;
for (int i = 0; i < 3; i++) {
if (i == 0 && nowScreenEmojiCount > 0) {
newScreenEmojiCount = nowScreenEmojiCount;
newClipboardEmojiCount = nowScreenEmojiCount;
}
if (i == 1 && nowClipboardEmojiCount > 0) {
newScreenEmojiCount = nowScreenEmojiCount + nowClipboardEmojiCount;
newClipboardEmojiCount = nowClipboardEmojiCount;
}
if (i == 2 && nowScreenEmojiCount > 0) {
newScreenEmojiCount = nowScreenEmojiCount - 1;
newClipboardEmojiCount = nowClipboardEmojiCount;
}
q.push({{newScreenEmojiCount, newClipboardEmojiCount}, nowTime + 1});
}
}
return 0;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> s;
cout << bfs();
}
'Algorythms' 카테고리의 다른 글
백준 1500번 최대 곱 c++ 풀이 (1) | 2024.01.22 |
---|---|
백준 16472번 고냥이 c++ 풀이 (0) | 2024.01.21 |
백준 6118번 숨바꼭질 c++ 풀이 (1) | 2024.01.21 |
백준 15989번 1,2,3 더하기 4 c++ 풀이 (1) | 2024.01.21 |
백준 2548번 대표 자연수 c++ 풀이 (0) | 2024.01.20 |