문제 출처 : https://www.acmicpc.net/problem/9019

 

9019번: DSLR

문제 네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에 저장된 n을 다음과 같이 변환한다. n의 네 자릿수를 d1, d2, d3, d4라고 하자(즉 n = ((d1 × 10 + d2) × 10 + d3) × 10 + d4라고 하자) D: D 는 n을 두 배로 바꾼다. 결과 값이 9999 보다 큰 경

www.acmicpc.net

이번 문제는 BFS를 이용하여 해결하는 문제이다.

기본적인 BFS 기법을 이용하여 해결하는 문제이지만 구조체에 char 배열을 선언해서 저장하는 형식으로 

풀어보았더니 타임 에러가 나오게 되었다.

그리고 숫자가 -1 될 때 0 일때 9999가 되는 것이 아니고 -1 일때 9999가 되는 것이므로 

런타임 에러도 조심해야 한다. 

그래서 check 배열로 타고 가는 것을 역추적하는 방식으로 타임 에러를 해결 할 수 있었다.

아래는 해당 문제를 풀이한 소스 코드이다.

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include<stdio.h>
#include<queue>
#pragma warning(disable:4996)
using namespace std;
int start, finish;
int visit[10001];
int check[10001];
int dir[10001];
char arr[10001];
struct list
{
    int num;
    int cnt = 0;
};
queue <list> que;
// D 2배 S n-1 L 왼편으로 이동 R 우측으로 이동
int D(int num)
{
    int n = 2 * num;
    if (n > 9999)
        n = n % 10000;
    return n;
}
int S(int num)
{
    int n = num - 1;
    if (n == -1)
        n = 9999;
    return n;
}
int L(int num)
{
    int n = num / 1000;
    int temp = (num % 1000* 10;
    return temp+n;
}
int R(int num)
{
    int n = num % 10;
    int temp = num / 10;
    return 1000 * n + temp;
}
void BFS()
{
    while (!que.empty())
    {
        list temp = que.front();
        que.pop();
        int num;
        if (temp.num == finish)
        {
            int i = 0;
            int x = finish;
            while (1)
            {
                if (x == start)
                    break;
                if (dir[x] == 1)
                    arr[i] = 'D';
                else if (dir[x] == 2)
                    arr[i] = 'S';
                else if (dir[x] == 3)
                    arr[i] = 'L';
                else
                    arr[i] = 'R';
                x = check[x];
                i++;
            }
            for (int i = temp.cnt - 1; i >= 0; i--)
            {
                printf("%c", arr[i]);
            }
            printf("\n");
            return;
        }
        list A = temp;
        num = D(temp.num);
        if (visit[num] == 0)
        {
            visit[num]=1;
            check[num] = temp.num;
            dir[num] = 1;
            A.num = num;
            A.cnt = temp.cnt + 1;
            que.push(A);
        }
        num = S(temp.num);
        if (visit[num] == 0)
        {
            visit[num]=1;
            A.cnt = temp.cnt + 1;
            check[num] = temp.num;
            dir[num] = 2;
            A.num = num;
            que.push(A);
        }
        num = L(temp.num);
        if (visit[num] == 0)
        {
            check[num] = temp.num;
            dir[num] = 3;
            visit[num]=1;
            A.cnt = temp.cnt + 1;
            A.num = num;
            que.push(A);
        }
        num = R(temp.num);
        if (visit[num] == 0)
        {
            check[num] = temp.num;
            dir[num] = 4;
            visit[num]=1;
            A.cnt = temp.cnt + 1;
            A.num = num;
            que.push(A);
        }
    }
}
void reset()
{
    for (int i = 0; i <= 10000; i++)
        visit[i] = 0;
    while (!que.empty())
        que.pop();
}
int main()
{
    int Test;
    scanf("%d"&Test);
    for (int i = 0; i < Test; i++)
    {
        scanf("%d %d"&start, &finish);
        list temp;
        temp.num = start;
        visit[start] = 1;
        que.push(temp);
        BFS();
        reset();
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

'알고리즘' 카테고리의 다른 글

백준 3079번 문제 ( 입국 심사 )  (0) 2020.02.26
백준 16397번 문제 ( 탈출 )  (0) 2020.02.18
백준 7569번 문제 ( 토마토 )  (0) 2020.02.18
백준 6593번 문제 ( 상범 빌딩 )  (0) 2020.02.18
백준 5427번 문제 ( 불 )  (0) 2020.02.18
블로그 이미지

뀨심볼

깃허브 주소는 : https://github.com/hhyc2 입니다~

,