[백준/파이썬] 14503번 풀이

업데이트:



문제 정보


풀이

문제

로봇 청소기와 방의 상태가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.

로봇 청소기가 있는 방은 $N \times M$ 크기의 직사각형으로 나타낼 수 있으며, $1 \times 1$ 크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북 중 하나이다. 방의 각 칸은 좌표 $(r, c)$로 나타낼 수 있고, 가장 북쪽 줄의 가장 서쪽 칸의 좌표가 $(0, 0)$, 가장 남쪽 줄의 가장 동쪽 칸의 좌표가 $(N-1, M-1)$이다. 즉, 좌표 $(r, c)$는 북쪽에서 $(r+1)$번째에 있는 줄의 서쪽에서 $(c+1)$번째 칸을 가리킨다. …

입력 요약
첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$  둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽, $1$인 경우 동쪽, $2$인 경우 남쪽, $3$인 경우 서쪽을 바라보고 있는 것이다.

셋째 줄부터 $N$개의 줄에 각 장소의 상태를 나타내는 $N \times M$개의 값이 한 줄에 $M$개씩 입력된다. …

출력 요약
로봇 청소기가 작동을 시작한 후 작동을 멈출 때까지 청소하는 칸의 개수를 출력한다.

코드

import sys; read=sys.stdin.readline
from collections import deque

n, m = map(int, read().split())
r, c, d = map(int, read().split())
cells = [list(map(int, read().split())) for _ in range(n)]

directions = [(-1,0), (0,1), (1,0), (0,-1)]

cnt = 0
while True:
    if cells[r][c] == 0: cnt += 1
    cells[r][c] = 2
##    print('=======')
##    print(r,c,d)
##    for row in cells:print(*row)
##    print('=======')
    moved = False
    od = d
    while True:
        d = (d-1) % 4
        i, j = r + directions[d][0], c + directions[d][1]
        if 0 <= i < n and\
           0 <= j < m and\
           cells[i][j] == 0:
            r, c = i, j
            moved = True
            break
        if od == d:break
    #if cells[r][c] != 2:
    if not moved:
        i, j = r + directions[(d+2)%4][0], c + directions[(d+2)%4][1]
        if 0 <= i < n and\
           0 <= j < m and\
           cells[i][j] != 1:
            r, c = i, j
        else: break
        
print(cnt)

설명

핵심은 구현 관점에서 로봇 청소기와 방의 상태가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.

로봇 청소기가 있는 방은 $N \times M$ 크기의 직사각형으로 나타낼 수 있으며, $1 \times 1$ 크기의 정사각형 칸으로 나누어져 있다. …를 만족하도록 로직을 구성하는 것입니다.

코드는 입력을 파싱한 뒤 조건 분기와 계산을 순서대로 수행하고, 문제에서 요구한 형식으로 결과를 출력합니다.

경계값과 예외 케이스도 함께 고려해 오답이 나기 쉬운 상황을 방지합니다.



다음 읽을거리

관련 허브 페이지에서 같은 주제의 글을 이어서 확인할 수 있습니다.

댓글남기기