[백준/파이썬] 14503번 풀이
업데이트:
문제 정보
- 문제 출처: 백준 온라인 저지
- 문제 링크: 14503번 문제
- 문제풀이 코드 GitHub 링크
- 제출 언어: Python 3
풀이
문제
로봇 청소기와 방의 상태가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.
로봇 청소기가 있는 방은 $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$ 크기의 정사각형 칸으로 나누어져 있다. …를 만족하도록 로직을 구성하는 것입니다.
코드는 입력을 파싱한 뒤 조건 분기와 계산을 순서대로 수행하고, 문제에서 요구한 형식으로 결과를 출력합니다.
경계값과 예외 케이스도 함께 고려해 오답이 나기 쉬운 상황을 방지합니다.
댓글남기기