PS/백준

14503번 - 로봇 청소기

ForteQook 2022. 8. 23. 18:17
 

 재귀함수를 이용한 기본적인 구현문제이다. DFS도, BFS도 아니고 구현 항목을 따라 작성하면 된다. 재밌는 문제라 따로 기록해둔다.

import sys
input = sys.stdin.readline
n,m = map(int,input().split())
r,c,d = map(int,input().split())
board = []
for _ in range(n):
    board.append(list(map(int, input().split())))

# 북 동 남 서
dRow = [-1,0,1,0]
dCol = [0,1,0,-1]
visited = set()


def rotate_ccw_90(face):
    return face-1 if face > 0 else 3


def robot(row,col,face):
    visited.add((row,col))
    board[row][col] = 3
    for _ in range(4):
        face = rotate_ccw_90(face)
        nRow,nCol = row+dRow[face],col+dCol[face]
        if board[nRow][nCol] != 1 and not (nRow,nCol) in visited:
            robot(nRow,nCol,face)
            break
    else:
        backward = tuple(map(lambda x : x*-1, (dRow[face],dCol[face])))
        nRow,nCol = row+backward[0],col+backward[1]
        if board[nRow][nCol] != 1:
            robot(nRow,nCol,face)

robot(r,c,d)

print(len(visited))

풀이 2

청소기의 이동을 잘 구현하면 되는 간단한 문제이다.

N,M = map(int,input().split())
r,c,d = map(int,input().split())
board = []
for _ in range(N):
    board.append(list(map(int,input().split())))

# 북 동 남 서
dRow = [-1,0,1,0]
dCol = [0,1,0,-1]

answer = 0
visited = [[0]*M for _ in range(N)]
while True:
    # 청소
    if visited[r][c] == 0:
        answer += 1
        visited[r][c] = 1
    # 왼쪽 검사
    for _ in range(4):
        d = (d+3)%4
        nr,nc = r+dRow[d],c+dCol[d]
        if 0 <= nr < N and 0 <= nc < M and board[nr][nc] == 0 and visited[nr][nc] == 0:
            r,c = nr,nc
            break
    # 인접 칸들이 모두 청소했거나, 벽인 칸이라면
    else:
        nr,nc = r-dRow[d],c-dCol[d]
        if 0 <= nr < N and 0 <= nc < M and board[nr][nc] == 0:
            r, c = nr, nc
        else:
            break

print(answer)

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

14890번 - 경사로  (0) 2022.08.25
14889번 - 스타트와 링크  (0) 2022.08.23
14500번 - 테트로미노  (1) 2022.08.23
14499번 - 주사위 굴리기  (0) 2022.08.23
12100번 - 2048(Easy)  (0) 2022.08.23