Skip to content

Commit 9a9befe

Browse files
committed
로봇청소기 / 골드 5 / 120ms
1 parent 24b4889 commit 9a9befe

1 file changed

Lines changed: 137 additions & 0 deletions

File tree

src/N14053/N14503_seoyeon.java

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
package N14053;
2+
3+
import java.io.BufferedReader;
4+
import java.io.BufferedWriter;
5+
import java.io.IOException;
6+
import java.io.InputStreamReader;
7+
import java.io.OutputStreamWriter;
8+
import java.util.StringTokenizer;
9+
10+
11+
public class N14503_seoyeon {
12+
13+
static int N, M;
14+
static int[][] map;
15+
static int currR, currC, currD; // 로봇의 최초 좌표와 방향
16+
17+
static int[] dr = {-1, 0, 1, 0};
18+
static int[] dc = {0, 1, 0, -1};
19+
static int cnt = 0;
20+
21+
public static void main(String[] args) throws IOException {
22+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
23+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
24+
25+
// 입력받기
26+
StringTokenizer st = new StringTokenizer(br.readLine());
27+
N = Integer.parseInt(st.nextToken());
28+
M = Integer.parseInt(st.nextToken());
29+
map = new int[N][M];
30+
31+
st = new StringTokenizer(br.readLine());
32+
currR = Integer.parseInt(st.nextToken());
33+
currC = Integer.parseInt(st.nextToken());
34+
currD = Integer.parseInt(st.nextToken());
35+
36+
for (int i = 0; i < N; i++) {
37+
st = new StringTokenizer(br.readLine());
38+
for (int j = 0; j < M; j++) {
39+
map[i][j] = Integer.parseInt(st.nextToken());
40+
}
41+
}
42+
43+
clean();
44+
45+
bw.write(Integer.toString(cnt));
46+
bw.flush();
47+
bw.close();
48+
br.close();
49+
}
50+
51+
private static void clean() {
52+
53+
while (true) {
54+
// 현재 좌표가 청소가 되지 않았을 경우
55+
if (map[currR][currC] == 0) {
56+
map[currR][currC] = -1;
57+
cnt++;
58+
}
59+
60+
// 청소가 되어있을 경우 -> 주위 동서남북 탐색
61+
boolean isDirty4 = false;
62+
for (int i = 0; i < dr.length; i++) {
63+
int nr = currR + dr[i];
64+
int nc = currC + dc[i];
65+
// 배열 범위 유효한지 확인
66+
if (nr < 0 || nr >= N || nc < 0 || nc >= M) {
67+
continue;
68+
}
69+
// 청소할 곳이 있으면
70+
if (map[nr][nc] == 0) {
71+
isDirty4 = true;
72+
break;
73+
}
74+
} // 4
75+
76+
// 주변 4칸 청소가 안 되었을 경우
77+
if (isDirty4) {
78+
for (int i = 0; i < 4; i++) {
79+
// 현재 방향에서 90도 회전
80+
mv();
81+
int frontR = currR + dr[currD];
82+
int frontC = currC + dc[currD];
83+
84+
// 배열 범위 및 청소할 곳인지 확인
85+
if ((frontR >= 0 && frontR < N && frontC >= 0 && frontC < M) && map[frontR][frontC] == 0 ) {
86+
currR = frontR;
87+
currC = frontC;
88+
break;
89+
} else {
90+
continue;
91+
}
92+
93+
}
94+
95+
}
96+
97+
// 주변 4칸 청소가 되어있을 경우
98+
else {
99+
100+
int backDir = (currD + 2) % 4;
101+
int backR = currR + dr[backDir];
102+
int backC = currC + dc[backDir];
103+
104+
// 벽이 아닌지 배열 범위를 초과하지 않는지 확인
105+
if (backR < 0 || backR >= N || backC < 0 || backC >= M || map[backR][backC] == 1) {
106+
return;
107+
}
108+
// 벽이 아니면 바로 뒤로 후진
109+
else {
110+
// 후진
111+
currR = backR;
112+
currC = backC;
113+
}
114+
}
115+
} // while
116+
117+
}
118+
119+
120+
// 인접한 4방향 중 청소가 안 되어있을 때 90도 방향을 바꾸는 함수
121+
private static void mv() {
122+
switch (currD) {
123+
case 0:
124+
currD = 3;
125+
break;
126+
case 1:
127+
currD = 0;
128+
break;
129+
case 2:
130+
currD = 1;
131+
break;
132+
case 3:
133+
currD = 2;
134+
break;
135+
}
136+
}
137+
}

0 commit comments

Comments
 (0)