[BOJ-Code] 14226 - 이모티콘

Posted by DHniyeo Blog on March 10, 2024

문제 링크

💡 너비 우선 탐색/다이나믹 프로그래밍/그래프 이론/그래프 탐색

Memory 16852KB Time 8ms Code Length 1019B

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h>
#include <algorithm>
#include <queue>
using namespace std;

struct INFO
{
	int monitor;
	int clipboard;
	int t;
};

queue<INFO> q;
int S; // 목표
int visited[2000][2000] = { 0 }; // 모니터 이모티콘 갯수 방문일지
int result;

void bfs() {
	while (!q.empty()) {
		int m = q.front().monitor;
		int c = q.front().clipboard;
		int t = q.front().t; q.pop();

		if (m == S) {
			result = t;
			return;
		}
		// 1. 클립보드 저장(덮어쓰기)
		int nc = m;
		if (visited[m][nc] == 0) {
			visited[m][nc] = 1;
			q.push({ m,nc,t + 1 });
		}
		// 2. 클립보드를 화면에 붙여넣기
		if (m + c <= 1500 && c!=0) {
			if (visited[m + c][c] == 0) {
				visited[m + c][c] = 1;
				q.push({ m + c, c, t + 1 });
			}
		}
		// 3. 이모티콘 하나 삭제
		if (m > 0) {
			if (visited[m - 1][c] == 0) {
				visited[m - 1][c] = 1;
				q.push({ m - 1, c, t + 1 });
			}
		}
	}

}

int main() {


	scanf("%d", &S);
	q.push({ 1,0, 0 });
	visited[1][0] = 1;
	bfs();
	printf("%d\n", result);
}

이 코드는 BFS(너비 우선 탐색) 알고리즘을 사용하여 이모티콘 작업을 수행하는 프로그램이다.

시작할 때, 화면에 1개의 이모티콘만 존재하고 클립보드는 비어있다.

큐에 이모티콘 상태와 작업 시간을 저장하고, 방문 여부를 체크한다.

큐가 빌 때까지 다음 작업을 반복한다.

현재 이모티콘 상태가 목표와 같으면 작업 시간을 결과로 저장하고 종료한다.

클립보드에 복사, 클립보드 내용을 화면에 붙여넣기, 이모티콘 하나 삭제 세 가지 작업을 수행한다.

각 작업을 수행한 후, 새로운 상태를 큐에 저장하고 작업 시간을 증가시킨다.

BFS 알고리즘을 통해 모든 가능한 상태를 탐색하고, 최종적으로 목표 상태에 도달하는데 걸리는 최소 작업 시간을 출력한다.