[swea-D2] 22654. 차윤이의 RC카
문제
6살 차윤이는 생일선물로 RC카를 선물받았다. 아직 조종이 익숙하지 않은 차윤이는 공원에서 조종 연습을 하려고 한다.
아래는 차윤이가 조종을 연습할 N x N 필드의 정보이다.
1
2
3
4
5
GGGGG
GXGTG
GGTTG
GGGYG
GTGGG
‘G’ : RC카가 이동 가능한 땅 ‘T’ : RC카가 이동이 불가능한 나무
‘X’ : 현재 RC카의 위치 ‘Y’ : RC카를 이동 시키고자 하는 위치
RC카의 조종기로는 아래의 동작들을 할 수 있다.
‘A’ : 앞으로 이동 - 나무가 있는 곳이나 필드를 벗어나는 경우에는 아무 일도 일어나지 않는다.
‘L’ : 현재 바라보고 있는 방향에서 왼쪽으로 90도 회전
‘R’ : 현재 바라보고 있는 방향에서 오른쪽으로 90도 회전
차윤이는 RC카를 항상 위를 바라보는 방향으로 부터 조종을 시작한다. 차윤이가 RC카를 조종한 커맨드가 주어졌을 때, 목적지에 도달 할 수 있는지 구하라. (커맨드가 종료되었을 때, 목적지에 위치 해 있어야 한다.)
입력
1
2
3
4
5
6
7
첫번째 줄에는 테스트 케이스의 개수 T가 주어진다. (1 <= T <= 10)
각 테스트 케이스의 첫번째 줄에 필드의 크기 N이 주어진다. (2 <= N <= 5)
두번째 줄부터 N개의 줄에 걸쳐 필드의 정보가 공백 없이 주어진다.
필드의 정보는 본문의 설명을 참고하라.
다음 줄에는 조종을 한 횟수 Q가 주어진다. (1 <= Q <= 5)
다음 Q개의 줄에는 커맨드의 길이 C와 커맨드가 공백으로 구분되어 주어진다. (1 <= C <= 50)
출력
1
2
3
4
5
6
T개의 줄에 걸쳐 각 테스트 케이스에 대한 정답을 출력한다.
각 줄은 "#t"로 시작하고 (t는 1부터 시작하는 테스트 케이스의 번호를 의미한다.) 공백을 하나 둔 후, 정답을 출력한다.
각 테스트케이스의 커맨드마다 목적지에 도달 할 수 있다면 1, 아니면 0을 공백으로 구분하여 출력한다.
목적지에 이동 가능 여부가 아닌, 커맨드를 전부 실행 후 목적지에 도달했는지를
확인해야 함에 유의하라.
입력
1
2
3
4
5
6
7
8
9
10
11
1
5
GGGGG
GXGTG
GGTTG
GGGYG
GTGGG
3
7 RRAALAA
8 RRAALAAA
12 RAARRALAALAA
출력
1
#1 1 0 1
🙋♂️ 들어가며
논리를 잘 구성해놓고 바보같이 마지막 줄에 줄바꿈을 안해서 계속 제출 실패를 했다
줄바꿈을 하지않으면 이렇게 되는 상황이었다 (다음은 예시다)
1
#1 1 0 1#2 0 1 1
필요한 출력형태는 다음과 같았다
1
2
#1 1 0 1
#2 0 1 1
✅ 코드
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
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for (int tc = 1; tc < T+1; tc++) {
int N = Integer.parseInt(br.readLine());
char[][] original_arr = new char[N][N];
// 1-1. 시작점, 끝점
int sr = 0;
int sc = 0;
int er = 0;
int ec = 0;
for (int r = 0; r < N; r++) {
String s = br.readLine();
for (int c = 0; c < s.length(); c++) {
original_arr[r][c] = s.charAt(c);
if (original_arr[r][c] == 'X') {
sr = r;
sc = c;
}
if (original_arr[r][c] == 'Y') {
er = r;
ec = c;
}
}
}
// 1-2. 초기 출력형태 생성
System.out.print("#" + tc + " ");
// 2. commands
int Q = Integer.parseInt(br.readLine());
for (int i = 0; i < Q; i++) {
// 2-1. 매번 좌표 초기화
char[][] arr = original_arr;
String[] str = br.readLine().split(" ");
int leng = Integer.parseInt(str[0]);
String command_arr = str[1];
char[] commands = new char[leng];
for (int j = 0; j < leng; j++) {
commands[j] = command_arr.charAt(j);
}
// 2-2. 초기 방향 (위쪽)
int d = 0;
int cr = sr;
int cc = sc;
for (int j = 0; j < leng; j++) {
char cur_button = commands[j];
int dr = 0;
int dc = 0;
// 2-3. 방향 설정
if (d == 0 && cur_button == 'A') {
dr = -1;
dc = 0;
}
else if (d == 1 && cur_button == 'A') {
dr = 0;
dc = 1;
}
else if (d == 2 && cur_button == 'A') {
dr = 1;
dc = 0;
}
else if (d == 3 && cur_button == 'A') {
dr = 0;
dc = -1;
}
else if (cur_button == 'R') {
d = (d+1) % 4;
continue;
}
else if (cur_button == 'L') {
d = ( (d-1) + (4) ) % 4;
continue;
}
// 2-4. 칸 확인 (범위 가능한지)
int nr = cr + dr;
int nc = cc + dc;
if (nr < 0 || nr >= N || nc < 0 || nc >= N) continue;
// 2-5. 지나갈 수 있는 칸인지?
// 2-5-a 나무라면 skip
if (arr[nr][nc] == 'T') continue;
// 2-5-b 빈공간이면 이동
if (arr[nr][nc] == 'G' || arr[nr][nc] == 'Y' || arr[nr][nc] == 'X') {
cr = nr;
cc = nc;
}
}
// 3. 검사
if (cr == er && cc == ec) {
System.out.print(1 + " ");
}
else System.out.print(0 + " ");
}
// 4. 줄바꿈
System.out.println();
}
}
}
This post is licensed under CC BY 4.0 by the author.

