문제 링크 : www.acmicpc.net/problem/14226
문제
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다.
영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만들어 보려고 한다.
- 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
- 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다.
- 화면에 있는 이모티콘 중 하나를 삭제한다.
모든 연산은 1초가 걸린다. 또, 클립보드에 이모티콘을 복사하면 이전에 클립보드에 있던 내용은 덮어쓰기가 된다. 클립보드가 비어있는 상태에는 붙여넣기를 할 수 없으며, 일부만 클립보드에 복사할 수는 없다. 또한, 클립보드에 있는 이모티콘 중 일부를 삭제할 수 없다. 화면에 이모티콘을 붙여넣기 하면, 클립보드에 있는 이모티콘의 개수가 화면에 추가된다.
영선이가 S개의 이모티콘을 화면에 만드는데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 S (2 ≤ S ≤ 1000) 가 주어진다.
출력
첫째 줄에 이모티콘을 S개 만들기 위해 필요한 시간의 최솟값을 출력한다.
접근 방법
처음 시작 조건(이모티콘 1개, 시간 0초, 클립보드 0개)에서 시작해서 각각 연산을 수행한 뒤 상태를 Queue에 push 한다.
여기서 주의할 점은 방문 여부를 체크하는 visit 배열이 이차원 배열이라는 것이다.
visit[i][j] 는 화면에 i개 이모티콘이 있고 클립보드에 j개 이모티콘이 있는 상태이다.
처음에 '시간이 더 나중인게 이모티콘 글자 수가 더 큰 경우' 에는 ?
이라는 의문이 들었는데,
whlie문 한 번 돌 때마다
if(s==S)인지 체크하고 / 1초씩 순차적으로 증가하기 때문에
if(s==S)이 만족해서 반복문이 멈출 때가 바로 시간의 최소값이다.
#include <iostream>
#include <queue>
#include <utility>
#include <vector>
#include <algorithm>
using namespace std;
int S;
int visit[1001][1001];
int ans;
void BFS(){
//임티개수, 초, 클립보드 안의 수
queue<pair<int, pair<int,int>>> que;
que.push(make_pair(1, make_pair(0,0)));
visit[1][0] = 1;
while(!que.empty()){
int s = que.front().first;
int sec = que.front().second.first;
int clip = que.front().second.second;
que.pop();
// cout << s<<"개 / " << sec<<"초 / " << clip<<"클립보드\n";
if(s==S) {
ans = sec;
return;
}
if(s>0 && s<=1000){
//복사
if(visit[s][s]==0){
visit[s][s] = 1;
que.push(make_pair(s, make_pair(sec+1, s)));
}
//하나 삭제
if(visit[s-1][clip] == 0){
visit[s-1][clip] = 1;
que.push(make_pair(s-1, make_pair(sec+1, clip)));
}
}
//붙여넣기
if(clip>0 && s+clip<=1000){
if(visit[s+clip][clip]==0){
visit[s+clip][clip] = 1;
que.push(make_pair(s+clip, make_pair(sec+1, clip)));
}
}
}
}
int main(){
cin >> S;
for(int i = 0; i<=1000; i++){
for(int j = 0; j<=1000; j++){
visit[i][j] = 0;
}
}
BFS();
cout << ans;
return 0;
}
'Algorithm(BOJ) > BFS' 카테고리의 다른 글
[C++] 백준 13549번 - 숨바꼭질 3 (BFS/Deque 덱) (1) | 2021.03.09 |
---|---|
[C++] 백준 13913번 - 숨바꼭질4 (BFS) (0) | 2021.03.09 |
[C++] 백준 1261번 - 알고스팟(BFS, 메모리초과 해결) (0) | 2021.03.08 |
[C++] 백준 1707번 - 이분 그래프 (BFS) (0) | 2021.03.07 |
[C++] 백준 7576번 - 토마토 (0) | 2021.03.07 |