본문 바로가기
백준

[python]로봇 청소기 - 14503번

by 청원뿔세포 2022. 12. 17.

빡구현 문제이다. 

청소를 할 수 있을 때와 못할 때 2경우로 크게 나눴다.

청소 가능한 경우 방향을 바꾸고 앞으로 움직여줘야 하는 것에 염두를 둬야한다.

청소를 하지 못할 경우는 작게 3가지로 나누었다.

1. 4방향을 모두 돌았는데 뒤가 벽일경우 break

2. 4방향 모두 돌았는데 뒤로 갈 수 있는 경우

3. 왼쪽을 바라봤을 때 청소를 할 수 없는 경우

 

청소를 하지 못할 경우의 2번째 경우는 방향전환을 할 필요없이 뒤로 가기만 하면되지만, 나머지 1, 3번째 경우는 방향을 돌려줘야 한다.

import sys
n,m = map(int, input().split())
r,c,d = map(int,input().split())
field = []
direction_to_left =[[0,-1],[-1,0],[0,1],[1,0]]
direction_to_back =[[1,0],[0,-1],[-1,0],[0,1]]
for i in range(n):
    field.append(list(map(int,sys.stdin.readline().split())))
cant_clean_stack = 0
result = 1 #시작자리 청소후 출발
field[r][c] = 2
while True:
    # print('--')
    # print('r,c',r,c)
    # for q in field:
    #     print(*q)
    # print(result,d,cant_clean_stack)
    toLeft = direction_to_left[d]
    toBack = direction_to_back[d]
    if field[r+toLeft[0]][c+toLeft[1]]==0:
        field[r+toLeft[0]][c+toLeft[1]] = 2
        r = r+toLeft[0]
        c = c+toLeft[1]
        d-=1
        d = d%4
        result+=1
        cant_clean_stack = 0
    else:
        if cant_clean_stack == 4 and field[r+toBack[0]][c+toBack[1]]==1:
            break
        elif cant_clean_stack == 4:
            r = r+toBack[0]
            c = c+toBack[1]
            cant_clean_stack = 0

        else:
            d-=1
            d = d%4
            cant_clean_stack+=1
print(result)

'백준' 카테고리의 다른 글

[python]은?행 털!자 1 - 26267  (0) 2022.12.19
[python] 멘토와 멘티 - 26265 번  (0) 2022.12.18
[python]팬그램 - 10384번  (0) 2022.12.16
[python] 어항 정리 - 23291번  (0) 2022.12.14
[python] 별꽃의 세레나데 (Easy) - 26217번  (0) 2022.12.13

댓글