1. 문제
14226번: 이모티콘
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다. 영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만��
www.acmicpc.net
문제
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다.
영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만들어 보려고 한다.
- 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
- 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다.
- 화면에 있는 이모티콘 중 하나를 삭제한다.
모든 연산은 1초가 걸린다. 또, 클립보드에 이모티콘을 복사하면 이전에 클립보드에 있던 내용은 덮어쓰기가 된다. 클립보드가 비어있는 상태에는 붙여넣기를 할 수 없으며, 일부만 클립보드에 복사할 수는 없다. 또한, 클립보드에 있는 이모티콘 중 일부를 삭제할 수 없다. 화면에 이모티콘을 붙여넣기 하면, 클립보드에 있는 이모티콘의 개수가 화면에 추가된다.
영선이가 S개의 이모티콘을 화면에 만드는데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 S (2 ≤ S ≤ 1000) 가 주어진다.
출력
첫째 줄에 이모티콘을 S개 만들기 위해 필요한 시간의 최솟값을 출력한다.
예제 입력 1 복사
2
예제 출력 1 복사
2
예제 입력 2 복사
4
예제 출력 2 복사
4
2. 소스코드
1회차 - 2020/05/30
- 문제를 보는 순간, DP와 BFS로 풀 수 있을 것 같았고 보다 직관적인 BFS로 풀었다.
- BFS로 풀때, 중복 체크를 하지 않으면 que가 무조건 터지는 문제.
- visited 배열을 [num][clip]으로 저장하고, 중복을 체크했다.
#include <iostream>
#include <queue>
#define MAX 1000
using namespace std;
int target;
int visited[MAX + 1][MAX + 1]; // 중복 체크
struct Info
{
int num, clip, depth;
}info;
queue <Info> que;
int main() {
cin >> target;
que.push({ 1, 0, 0 });
while (!que.empty())
{
auto k = que.front(); que.pop();
int num = k.num;
int clip = k.clip;
int depth = k.depth;
if (num == target) { // 값에 도달한 경우 종료
cout << depth << '\n';
return 0;
}
//1번 명령어 : clip으로 복사.
if (clip < num) {
que.push({ num, num, depth + 1 });
}
//2번 명령어 : clip 갯수 붙여넣기
if (!visited[num][clip] and clip + num <= 1000 and clip) {
visited[num][clip] = 1;
que.push({ num + clip, clip, depth + 1 });
}
//3번 명령어 : 1개 제거
if (!visited[num - 1][clip] and num > 2) {
visited[num - 1][clip] = 1;
que.push({ num - 1, clip, depth + 1 });
}
}
return 0;
}
'알고리즘 > BOJ(백준)' 카테고리의 다른 글
[ 백준-1261번 / DFS / 0-1 BFS / 다익스트라 ] 알고스팟 (0) | 2020.06.01 |
---|---|
[ 백준-13549번 / 다익스트라 / BFS ] 숨바꼭질3 (0) | 2020.05.30 |
[ 백준-2293번 / DP ] 동전 1 (0) | 2020.05.23 |
[ 백준-18809번 / 완전탐색 / 구현 ] Gaaaaaaaaaarden (0) | 2020.05.22 |
[ 백준 - 3024 / 구현 ] 마라톤 틱택토 (0) | 2020.05.22 |