상세 컨텐츠

본문 제목

백준 14503 - 로봇 청소기 Python

학생일기/알고리즘

by jaws99 2020. 11. 3. 15:24

본문

반응형
from collections import deque
import sys

def countvisit():
    count = 0
    for i in range(N):
        for j in range(M):
            if arr[i][j] == 2:
                count += 1
    return count
            
def func(x,y,see):
    for _ in range(4):
        if 0<=x<N and 0<=y<M:
            if arr[x][y] == 0:
                arr[x][y] = 2 # visit
            
            if (0==y or (0<=y and (arr[x][y-1] != 0))) and (x==0 or (0<=x-1 and (arr[x-1][y] != 0))) and (y==M-1 or (y+1<M and (arr[x][y+1] != 0))) and (x==N-1 or (x+1<N and (arr[x+1][y] != 0))):
                if see == 0 and (x+1<N and arr[x+1][y] == 2):
                    func(x+1,y,see)
                elif see == 1 and (0<=y-1 and arr[x][y-1] == 2):
                    func(x,y-1,see)
                elif see == 2 and (0<=x-1 and arr[x-1][y] == 2):
                    func(x-1,y,see)
                elif see == 3 and (y+1<M and arr[x][y+1] == 2):
                    func(x,y+1,see)
                else:
                    print(countvisit())
                    sys.exit(0)

            elif see == 0 and 0<=y-1:
                if arr[x][y-1] == 0: # ↑
                    func(x,y-1,3)
            elif see == 1 and 0<=x:
                if arr[x-1][y] == 0: # →
                    func(x-1,y,0)
            elif see == 2 and y+1<M:   
                if arr[x][y+1] == 0: # ↓
                    func(x,y+1,1)
            elif see == 3 and x+1<N:
                if arr[x+1][y] == 0: # ←
                    func(x+1,y,2)
        see = (see - 1) % 4

N,M = map(int,input().split())
R,C,see = map(int,input().split())
arr = [[0] * M for _ in range(N)]
for i in range(N):
    read = input().split()
    for j in range(M):
        arr[i][j] = int(read[j])
func(R,C,see)

 

1번 조건

arr[x][y]를 0과 비교해서 같으면 visit으로 가정하고 2로 바꿔줍니다.

 

2번 조건 - c,d

4방향을 전부 비교해서 조건문이 길어졌습니다.

0==y or (0<=y and (arr[x][y-1] != 0))

맨 앞 조건문만 확인하면 y == 0은 배열의 끝에 있는지를 비교하고, (0<=y and (arr[x][y-1] != 0))은 배열의 끝은 아니지만 청소를 했던 곳인지를 확인합니다. 이 조건문에 들어온다는 소리는 네 방향 모두 청소가 이미 되어있거나 벽인 경우입니다.

조건문에 들어왔다면 if ~ elif를 통해 바라보는 방향과, 내 뒤가 벽인지를 확인합니다.

내 뒤가 벽이 아니라면 한 칸 후진하는 c 조건을 따라 2번으로 넘어갑니다.

벽이 아니라면 d 조건으로 청소한 영역을 체크하고 종료합니다.

 

2번 조건 - a

그다음 나오는 4개의 elif를 확인하면 됩니다.

see가 0이면 동쪽을 보고 있는데 왼쪽 방향이 청소가 됐는지 확인하므로 y-1을 비교해야 합니다.

같은 방법으로 4방향을 비교합니다.

 

2번 조건 - b

모든 조건문이 맞지 않으면 왼쪽 방향으로 회전을 합니다.

see = (see - 1) % 4로 동쪽을 보는 0에서 북쪽을 보는 3으로 갈 수 있습니다.

반응형

관련글 더보기