
풀이 소요시간 : 15분
BFS 로 최단 시간을 구하는 방식을 사용했다. 빠르게 풀 수 있었지만 DP 방식으로 푼 사람의 수도 많아보인다. 이번에는 unordered_map 을 사용하여 방문체크를 하는 방식으로 리팩토링을 해보았다. 이차원 배열 방문체크는 해보지 않았지만, 우선 1차원 배열에서는 뛰어난 성능을 보이고 코드 또한 단순화되는 것 같다.
#include <string>
#include <unordered_map>
#include <vector>
#include <queue>
using namespace std;
unordered_map<int, int> Map;
int Y;
int X;
int Bfs(int x, int n) {
    
    queue<pair<int, int>> Q;
    Q.push({x, 0});
    
    while(!Q.empty()) {
        
        int px = Q.front().first;
        int time = Q.front().second;
        Q.pop();
        
        if(px == Y) return time;
        
        // 범위 초과 & 방문 가능 고려
        
        if(px + n <= Y && Map[px + n] == 0) {
            Map[px + n]++;
            Q.push({px + n, time + 1});
        }
    
        
        if(px * 2 <= Y && Map[px * 2] == 0) {
            Map[px * 2]++;
            Q.push({px * 2, time + 1});
        }
        
        
        if(px * 3 <= Y && Map[px * 3] == 0) {
            Map[px * 3]++;
            Q.push({px * 3, time + 1});
        }
        
        
    }
    
    return -1;
}
int solution(int x, int y, int n) {
    
    X = x;
    Y = y;
    Map[x]++;
    return Bfs(x, n);
    
}