[BOJ] 14226 : 이모티콘

14226 : 이모티콘

풀이

BFS

check배열을 [현재이모티콘] [클립보드값] 이렇게 2차원으로 둔다.

그리고는 3가지 상황에 대해서 조건이 맞으면 체크하고 큐에 넣는

BFS탐색을 진행하면 된다.

1: 이모티콘 모두복사 후 클립보드 저장

d[e][c] -> d[e][e]


2: 클립보드 이모티콘 화면에 붙여넣기

d[e][c] -> d[e+c][c]


3. 화면에 있는 이모티콘 중 하나를 삭제

d[e][c] -> d[e-1][c]

코드

#include <iostream>
#include <queue>
#include <tuple>

#define MAX_NUM 1000

using namespace std;

//현재 위치, 복사된거, 시간
typedef tuple<int, int, int> my_t;

bool check[1001][1001];
int s;

int main() {
    
    cin >> s;
    
    check[1][0] = true;
    queue<my_t> q;
    q.push({ 1, 0, 0 });
    
    int cur, time, copy, next;
    while (!q.empty()) {
        tie(cur, copy, time) = q.front();
        
        if (cur == s) {
            cout << time << endl;
            break;
        }
        
        if (cur != copy) {
            q.push({ cur, cur, time + 1 });
        }
        
        if (copy != 0) {
            next = cur + copy;
            if (next <= MAX_NUM) {
                if (!check[next][copy]) {
                    check[next][copy] = true;
                    q.push({ next, copy, time + 1 });
                }
            }
        }
        
        next = cur - 1;
        if (next >= 0) {
            if (!check[next][copy]) {
                check[next][copy] = true;
                q.push({ next, copy, time + 1 });
            }
        }
        
        q.pop();
    }
    
    return 0;
}

Written on April 1, 2019