문제풀이/백준oj

[백준OJ] 9019번 DSLR

Hyeon-Uk 2021. 8. 13. 16:07
반응형

https://www.acmicpc.net/problem/9019

 

9019번: DSLR

네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에

www.acmicpc.net


 

 

풀이

BFS를 이용하였다. BFS를 이용해서 처음 입력받은 수를 각각 D,S,L,R 을 시행했을때, 변환된 숫자가 한번도 나오지 않은 숫자라면, 큐에 추가해주며 최단거리로 바꿔야 하는 숫자에 도달했을때, 그 바뀐 로그를 출력해주면 된다.

 

시간복잡도

BFS알고리즘이므로, 최악으로 0~10000까지 모두 탐색을 해서 맞추는것이므로, O(1)이 된다.

 

반응형

코드

#include<iostream>
#include<queue>
#include<string>

using namespace std;

void bfs(int a,int b){
    bool visited[10001]={0};
    queue<pair<int,string>> q;
    q.push({a,""});
    visited[a]=true;
    
    while(!q.empty()){
        int now=q.front().first;
        string now_str=q.front().second;
        q.pop();
        
        if(now==b){
            cout<<now_str<<"\n";
            return;
        }
        
        int D=(now*2)%10000;
        if(!visited[D]){
            visited[D]=true;
            q.push({D,now_str+"D"});
        }
        
        int S=(now-1<0?9999:now-1);
        if(!visited[S]){
            visited[S]=true;
            q.push({S,now_str+"S"});
        }
        
        int L=(now%1000)*10+(now/1000);
        if(!visited[L]){
            visited[L]=true;
            q.push({L,now_str+"L"});
        }
        
        int R=(now%10)*1000+(now/10);
        if(!visited[R]){
            visited[R]=true;
            q.push({R,now_str+"R"});
        }
    }
}

int main() {
	
    int t;
    cin>>t;
    while(t--){
        int a,b;
        cin>>a>>b;
        bfs(a,b);
    }
    
	return 0;
}
반응형