Post

🦊 로봇청소기

1. 문제 링크

14503번: 로봇 청소기



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.