zz12345의 코딩 공부

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

 

9019번: DSLR

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

www.acmicpc.net

 

코드

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
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <queue>
#include <string>
#include <cstring>
using namespace std;
int DSLR(int now,char t)
{
    int next;
    if(t=='D')
    {
        next=now*2;
        if(next>9999) next=next%10000;
    }
    else if(t=='S')
    {
        if(now==0)next=9999;
        else next=now-1;
    }
    else if(t=='L')
    {
       next=(now*10+now/1000)%10000
    }
    else
    {
        next=now%10*1000+now/10;
    }
    return next;
}
int main() {
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL);
    int tc;
    string str="DSLR";
    bool check[10000];
    queue<int> q;
    cin>>tc;
    while(tc--)
    {
        string m[10000];
        memset(check,false,sizeof(check));
        int a,b;
        cin>>a>>b;
        q.push(a);
        int ok=0;
        while(!q.empty())
        {
            int now=q.front(); q.pop();
            for(int i=0;i<4;i++)
            {
                if(now==0 && i==0continue;
                int next=DSLR(now,str[i]);
                if(!check[next])
                {
                    check[next]=true;
                    m[next]=m[now]+str[i];
                    if(b==next)
                    {
                        ok=1;
                        break;
                    }
                    q.push(next);
                }
            }
            if(ok)
            {   
                 q=queue<int>();
                  break;
            }
        }
        cout<<m[b]<<"\n";
    }
    return 0;
}
cs

 

풀이

 bfs를 이용하여 최종값 b를 찾는 방법을 사용했는데 주의할 점은 숫자 0에서 D 명령을 수행하면 0*2=0으로 0에서 0으로 가는데 명령어 D를 사용한 것이 되기 때문에 50행의 if(now==0 && i==0) continue; 를 추가해줘야 한다. bfs를 수행하다가 최종값 b를 만나고 b로 만들어주는 명령어를 m 배열에 추가했다면 (55행) 이제 더는 bfs를 수행할 필요가 없기 때문에 ok변수를 이용해서 반복문을 빠져 나와준다. 이때 다음 테스트케이스를 위하여 큐를 초기화하여야 하는데 큐는 clear()가 없기 때문에  q=queue<int>(); 문장으로 큐를 재선언하여 비워줬다. (처음 써봄)

L명령과 R명령은 

L : next=(now*10+now/1000)%10000

R : next=now%10*1000+now/10 으로 간단하게 가능하다!

 

공유하기

facebook twitter kakaoTalk kakaostory naver band