백준의 킹(1063) 문제이다.

( 문제 바로가기 )


[ 문제풀이 ]

1) 이 문제는 문제의 조건대로 그대로 구현해주면 되는 시뮬레이션 문제이다. 구현하기 전, 우리가 고려해야될 몇가지에 대해서

   파악하고 들어가보자.

   1. 열은 A ~ H , 행은 8 ~ 1 이다.

     즉, 맵의 가장 왼쪽위가 A1이 아닌, A8이라는 것이다. 열은 A~H이기 때문에 이를 숫자로 바꿔버리면 1열 ~ 8열 순서대로

     되어있지만, 행 같은 경우 8 ~ 1 로 감소하는 순으로 주어졌기 때문에 8행 1열을 입력받았을 때 우리는 이를 1행 1열로

     계산을 해줘야 한다는 것이다.

     그렇다면 우리는 계산할 때, 이 부분에 주의를 해줘야 한다는 것을 알고있자.

   2. 킹을 움직이는데, 맵 밖으로 나가게 되는 경우, 그 명령을 건너 뛰어야 한다.

      킹을 무작정 움직이다가 맵 밖으로 나가게 되면 그 명령을 건너뛰어야 한다. 킹을 맵 밖으로 보내버리면 안된다.

   3. 킹을 움직이는데, 돌을 만나게 되는 경우, 돌도 킹과 같은 방향으로 움직여야 한다.

      킹이 움직일 때 마다, 돌의 위치와 같은 위치인지 항상 생각해줘야 하고, 그럴 경우와 아닌 경우에 대해

      처리해야될 부분이 다르다.

     

2) 1번부터 들어가보자. 먼저, 명령에 따라서 우리는 8칸을 움직일 수가 있다.

  이렇게 총 8칸을 움직이는데, 위의 명령에 따라서 x, y 값이 어떻게 바뀌는지 알아보자.

 

   중요한건 y값이다. 가장 아래 행이 1행이고, 가장 위의 행이 8행이기 때문에, 북쪽으로 갈수록 y값은 증가, 남쪽으로 갈수록

   y값은 감소한다는 점 주의하자.

  

   2번은 킹이 한번 움직일 때 마다 맵의 범위 내에 있는 체크해주면 된다. 움직이려는 좌표점의 x , y값이 1보다 크거나 같고

   8보다 작거나 같으면 맵의 범위 내에 있는 것이다.

   3번은 2번 안에 속해야 되는 내용이다. 범위 체크를 하는 것에 대한 순서를 정리해보자.

   - 1. 움직이려는 킹의 좌표가 맵의 범위내에 있는지 ??

   - 2. 맵의 범위 내에 있다면, 혹시 그 좌표가 돌이 있는 좌표인지 아닌지 ??

     - 2.1 돌이 있는 곳이라면, 돌을 킹과 같은 방향으로 움직였을 때, 돌 또한 맵의 범위내에 있는지?

     - 2.2 돌이 없는 곳이라면, 그대로 진행.

   이런 순서로 진행되어야 한다.

   구현 자체는 어려운 부분이 없으니, 소스코드를 참고하길 바란다.


[ 소스코드 ]

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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
// 열 = A ~ H / a b c d e f g h 8
// 행 = 1 ~ 8 / 8행
 
#include<iostream>
#include<string>
 
#define MAX 51
using namespace std;
 
int N, Kx, Ky, Rx, Ry;
string Move[MAX];
 
void Input()
{
    char a;
    cin >> a >> Ky;
    Kx = a - 'A' + 1;
    cin >> a >> Ry;
    Rx = a - 'A' + 1;
 
    cout << "King = " << Kx << Ky << endl;
    cout << "Rock = " << Rx << Ry << endl;
 
    cin >> N;
 
    for (int i = 0; i < N; i++)
    {
        cin >> Move[i];
    }
 
    //for (int i = 0; i < N; i++) cout << Move[i] << endl;
}
 
bool SamePosition(int Kx, int Ky, int Rx, int Ry)
{
    if (Kx == Rx && Ky == Ry) return true;
    return false;
}
 
bool RangeCheck(int x, int y)
{
    if (x < 1 || y < 1 || x > 8 || y > 8return false;    // 범위밖을 나가버리면 false를 반환
    return true;                                        // 아니면 true를 반환
}
 
void Movement()
{
    for (int i = 0; i < N; i++)
    {
        if (Move[i] == "R")
        {
            if (RangeCheck(Kx + 1, Ky))
            {
                Kx++;
                if (SamePosition(Kx, Ky, Rx, Ry))
                {
                    if (RangeCheck(Rx + 1, Ry)) Rx++;
                    else Kx--;
                }
            }
        }
        else if (Move[i] == "L")
        {
            if (RangeCheck(Kx - 1, Ky))
            {
                Kx--;
                if (SamePosition(Kx, Ky, Rx, Ry))
                {
                    if (RangeCheck(Rx - 1, Ry)) Rx--;
                    else Kx++;
                }
            }
        }
        else if (Move[i] == "B")
        {
            if (RangeCheck(Kx, Ky - 1))
            {
                Ky--;
                if (SamePosition(Kx, Ky, Rx, Ry))
                {
                    if (RangeCheck(Rx, Ry - 1)) Ry--;
                    else Ky++;
                }
            }
        }
        else if (Move[i] == "T")
        {
            if (RangeCheck(Kx, Ky + 1))
            {
                Ky++;
                if (SamePosition(Kx, Ky, Rx, Ry))
                {
                    if (RangeCheck(Rx, Ry + 1)) Ry++;
                    else Ky--;
                }
            }
        }
        else if (Move[i] == "RT")
        {
            if (RangeCheck(Kx + 1, Ky + 1))
            {
                Kx++;
                Ky++;
                if (SamePosition(Kx, Ky, Rx, Ry))
                {
                    if (RangeCheck(Rx + 1, Ry + 1))
                    {
                        Rx++;
                        Ry++;
                    }
                    else
                    {
                        Kx--;
                        Ky--;
                    }
                }
            }
        }
        else if (Move[i] == "LT")
        {
            if (RangeCheck(Kx - 1, Ky + 1))
            {
                Kx--;
                Ky++;
                if (SamePosition(Kx, Ky, Rx, Ry))
                {
                    if (RangeCheck(Rx - 1, Ry + 1))
                    {
                        Rx--;
                        Ry++;
                    }
                    else
                    {
                        Kx++;
                        Ky--;
                    }
                }
            }
        }
        else if (Move[i] == "RB")
        {
            if (RangeCheck(Kx + 1, Ky - 1))
            {
                Kx++;
                Ky--;
                if (SamePosition(Kx, Ky, Rx, Ry))
                {
                    if (RangeCheck(Rx + 1, Ry - 1))
                    {
                        Rx++;
                        Ry--;
                    }
                    else
                    {
                        Kx--;
                        Ky++;
                    }
                }
            }
        }
        else if (Move[i] == "LB")
        {
            if (RangeCheck(Kx - 1, Ky - 1))
            {
                Kx--;
                Ky--;
                if (SamePosition(Kx, Ky, Rx, Ry))
                {
                    if (RangeCheck(Rx - 1, Ry - 1))
                    {
                        Rx--;
                        Ry--;
                    }
                    else
                    {
                        Kx++;
                        Ky++;
                    }
                }
            }
        }
    }
    char Result_King = Kx + 'A' - 1;
    char Result_Rock = Rx + 'A' - 1;
    cout << Result_King << Ky << endl;
    cout << Result_Rock << Ry << endl;
}
 
void Solution()
{
    Movement();
}
 
void Solve()
{
    Input();
    Solution();
}
 
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    freopen("Input.txt""r", stdin);
    Solve();
    return 0;
}
cs









+ Recent posts