반응형
14226번 이모티콘 문제 풀이
문제
- 영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다.
영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만들어 보려고 한다.- 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
- 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기한다.
- 화면에 있는 이모티콘 중 하나를 삭제한다.
- 모든 연산은 1초가 걸린다. 또, 클립보드에 이모티콘을 복사하면 이전에 클립보드에 있던 내용은 덮어쓰기가 된다. 클립보드가 비어있는 상태에는 붙여넣기를 할 수 없으며, 일부만 클립보드에 복사할 수는 없다. 또한, 클립보드에 있는 이모티콘 중 일부를 삭제할 수 없다. 화면에 이모티콘을 붙여넣기 하면, 클립보드에 있는 이모티콘의 개수가 화면에 추가된다. 영선이가 S개의 이모티콘을 화면에 만드는데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.
입력
- 첫째 줄에 S (2 ≤ S ≤ 1000) 가 주어진다.
출력
- 첫째 줄에 이모티콘을 S개 만들기 위해 필요한 시간의 최솟값을 출력한다.
예제
입력
2
4
6
18
출력
2
4
5
8
코드
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int n;
int visited[1001][1001];
int main() {
ios_base::sync_with_stdio(false);
cin >> n;
queue<pair<int, int>> q;
q.push(make_pair(1, 0));
visited[1][0] = 0;
while (!q.empty()) {
int s, c;
s = q.front().first;
c = q.front().second;
q.pop();
if (visited[s][s] == 0) {
visited[s][s] = visited[s][c] + 1;
q.push(make_pair(s, s));
}
if (s + c <= n && visited[s + c][c] == 0) {
visited[s + c][c] = visited[s][c]+1;
q.push(make_pair(s + c, c));
}
if (s - 1 >= 0 && visited[s - 1][c] == 0) {
visited[s - 1][c] = visited[s][c]+1;
q.push(make_pair(s - 1, c));
}
}
int ans = -1;
for (int i = 0; i <= n; i++) {
if (visited[n][i] != 0) {
if (ans == -1 || ans > visited[n][i]) {
ans = visited[n][i];
}
}
}
cout << ans << "\n";
}
해결방법
cin >> n;
queue<pair<int, int>> q;
q.push(make_pair(1, 0));
visited[1][0] = 0;
- visited배열은 방문 횟수를 저장하며 visited[screen][clip]으로 생각하고 코드를 진행한다. 따라서 처음에는 한 개의 이모티콘이 존재함과 동시에 시작점이 되기 때문에 visited[1][0]=0을 선언한다.
- bfs를 수행하기위해 queue에 (1,0)을 삽입힌다.
while (!q.empty()) {
int s, c;
s = q.front().first;
c = q.front().second;
q.pop();
if (visited[s][s] == 0) {
visited[s][s] = visited[s][c] + 1;
q.push(make_pair(s, s));
}
if (s + c <= n && visited[s + c][c] == 0) {
visited[s + c][c] = visited[s][c]+1;
q.push(make_pair(s + c, c));
}
if (s - 1 >= 0 && visited[s - 1][c] == 0) {
visited[s - 1][c] = visited[s][c]+1;
q.push(make_pair(s - 1, c));
}
}
- 복사 : visited[screen][clip]에서 clip은 screen의 이모티콘 개수를 그대로 복사한다.
- 붙여넣기 : 우선 screen + clip이 우리가 구하려는 갯수보다 작거나 같은 경우, visited[screen+clip][clip]에 이전 탐색한 시간 + 1을 해준다.
- 삭제하기 : screen-1이 0보다 적어지지 않는 경우에 수행할 수 있다. visited[screen-1][clip]에 이전 탐색한 시간 +1을 해준다.
int ans = -1;
for (int i = 0; i <= n; i++) {
if (visited[n][i] != 0) {
if (ans == -1 || ans > visited[n][i]) {
ans = visited[n][i];
}
}
}
cout << ans << "\n";
- 복사하기 조건에서 s+c<=n이 될 수 없었기 때문에 clip의 최대 값 또한 n보다 커질 수 없다. 따라서 for문의 i값 탐색 조건을 i<=n까지로 정의한다.
- visited[n][i], 즉 우리가 구하려는 이모티콘 개수에 도달하였을 때 clip은 0~n까지의 값을 가지고 있다. 따라서 visited[n][0] ~ visited[n][n]까지의 값들 중 가장 작은 값을 출력하면 된다.
반응형
'Algorithm > 그래프' 카테고리의 다른 글
| [Baekjoon] 백준 1261번 알고스팟 (0) | 2025.12.31 |
|---|---|
| [Baekjoon] 백준 14549번 숨바꼭질3 (0) | 2025.12.31 |
| [Baekjoon] 백준 1697번 숨바꼭질 (0) | 2025.12.31 |
| [Baekjoon] 백준 7576번 토마토 (0) | 2025.12.31 |
| [Baekjoon] 백준 2178번 미로탐색(지나온 경로탐색 추가) (0) | 2025.12.31 |