[백준] 14503번: 로봇청소기

yewon Lee·2023년 6월 29일
0


BACKJOON>14503번: 로봇청소기


📘 문제풀이

import sys
from collections import deque


n, m = map(int, sys.stdin.readline().split())
r, c, d = map(int, sys.stdin.readline().split())

graph = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
visited = [[False] * m for _ in range(n)]

#현재 방향을 기준으로 왼쪽부터 탐색 d = 0, 3, 2, 1
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

cnt = 0
x = r
y = c

while 1:
    
    if graph[x][y] == 0:
        graph[x][y] = 2
        cnt += 1
    
    flag = 0
    for _ in range(4):
        
        nx = x + dx[(d+3)%4]
        ny = y + dy[(d+3)%4]
        
        #반시계방향으로 90도 회전
        d = (d+3)%4
        if nx < 0 or nx > n-1 or ny < 0 or ny > m-1: #좌표를 벗어났을 때
            continue
        
        if graph[nx][ny] != 0:
            continue
        
        if graph[nx][ny] == 0: #주변 칸에 청소가 안된 칸이 있을 때
            flag = 1
            ddx = dx[d]
            ddy = dy[d]
            
            if x+ddx < 0 or x+ddx > n-1 or y+ddy < 0 or y+ddy > m-1: #좌표를 벗어났을 때
                continue
            
            if graph[x+ddx][y+ddy] == 0:
                x = x+ddx
                y = y+ddy
            break
    
    if flag == 0:
        #dr = (d+2)%4 #후진
        #if x+dr >= 0 or x+dr <= n-1 or y+dr >= 0 or y+dr <= m-1: 
        #    continue           
        if graph[x-dx[d]][y-dy[d]] == 1:
            print(cnt)
            break
        else:
            x = x-dx[d]
            y = y-dy[d]
profile
시작

0개의 댓글