🦊 로봇청소기
1. 문제 링크
2. 코드
Python3
/ 메모리 31256kb
/ 시간 44ms
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
def has_trash(x, y):
global MAP, N, M
delta = [[-1, 0], [0, 1], [1, 0], [0, -1]]
for dx, dy in delta:
nx = x + dx
ny = y + dy
# print(nx, ny, MAP[ny][nx])
if 0 <= nx < N and 0 <= ny < M and MAP[nx][ny] == 0:
return True
return False
# 4칸 중 앞칸에 쓰레기가 있는지
def get_pos_and_direction_to_next_trash(x, y, d):
global MAP, N, M
delta = [[-1, 0], [0, 1], [1, 0], [0, -1]]
# 반시계 방향으로 회전하고 거기에 쓰레기가 있으면 움직임
for i in range(1, 5):
dx, dy = delta[((d + 4 - i) % 4)]
nx = x + dx
ny = y + dy
if 0 <= nx < N and 0 <= ny < M and MAP[nx][ny] == 0:
return [nx, ny, (d + 4 - i) % 4]
# return [-1, -1, -1]
def get_pos_to_backword(x, y, d):
global MAP, N, M
delta = [[-1, 0], [0, 1], [1, 0], [0, -1]]
dx, dy = delta[((d + 2) % 4)]
nx = x + dx
ny = y + dy
# print(nx, ny)
if 0 <= nx < N and 0 <= ny < M and MAP[nx][ny] != 1:
# 후진해도 벽이 없음
return [nx, ny]
# 후진하면 벽에 박음
return [-1, -1]
N, M = map(int, input().split())
r, c, d = map(int, input().split())
MAP = []
for i in range(N):
MAP.append(list(map(int, input().split())))
# 청소 안된 칸 = 0
# 벽 = 1
# 청소한 칸 = 2
x = r
y = c
count = 0
while True:
if MAP[x][y] == 0:
count +=1
MAP[x][y] = 2
# 쓰레기가 있으면 반시계로 이동하고 다음칸으로 이동
if has_trash(x, y):
x, y, d = get_pos_and_direction_to_next_trash(x, y, d)
# 없으면 후진
else:
x, y = get_pos_to_backword(x, y, d)
if x == -1:
break
if MAP[x][y] == 0:
count +=1
MAP[x][y] = 2
print(count)
해설
문제에서 설명한 그대로 진행함
회전할때나 방향을 찾을 때 %4 로 나머지 연산하는게 편리
This post is licensed under CC BY 4.0 by the author.