728x90
문제 이해하기
이 문제는 로봇 청소기가 방을 돌아다니며 청소하는 영역의 개수를 구하는 것이다.
문제 설명
- 방의 구조: N x M 크기의 직사각형 방이 있고, 각 칸은 벽(1) 또는 빈 칸(0)이다.
- 로봇 청소기의 위치와 방향:
- 좌표 (r, c)에 위치해 있으며, 방향 d를 가지고 있다.
- 방향 d는 북(0), 동(1), 남(2), 서(3) 중 하나이다.
- 로봇 청소기의 작동 방식:
- 현재 위치를 청소한다.
- 현재 위치에서 다음을 반복한다:
- 주변 4칸 중 청소되지 않은 빈 칸이 있는지 확인한다.
- 있다면, 반시계 방향으로 90도 회전하고, 전진한다.
- 없다면, 바라보는 방향을 유지한 채로 후진한다.
- 후진할 수 없다면 작동을 멈춘다.
- 주변 4칸 중 청소되지 않은 빈 칸이 있는지 확인한다.
- 청소한 칸의 개수를 구한다.
해결 방법: 시뮬레이션 구현
이 문제는 로봇 청소기의 동작을 그대로 구현하는 시뮬레이션 문제이다.
구현 단계
- 입력 받기:
- 방의 크기 N, M과 로봇 청소기의 초기 위치 (r, c), 방향 d를 입력받는다.
- 방의 상태를 2차원 리스트로 저장한다.
- 방문 여부 표시:
- 청소한 칸을 표시하기 위해 방문 배열을 사용한다.
- 청소한 칸은 visited[r][c] = True로 표시한다.
- 로봇 청소기의 동작 구현:
- 현재 위치를 청소한다.
- 다음을 반복한다:
- 현재 위치에서 현재 방향을 기준으로 왼쪽 방향부터 차례대로 탐색한다.
- 왼쪽 방향에 청소되지 않은 빈 칸이 있으면 그 방향으로 회전하고 한 칸 전진한다.
- 네 방향 모두 청소되어 있거나 벽인 경우, 바라보는 방향을 유지한 채로 한 칸 후진한다.
- 후진할 수 없다면 작동을 멈춘다.
- 결과 출력:
- 청소한 칸의 개수를 출력한다.
방향 설정
- 방향은 북(0), 동(1), 남(2), 서(3)이다.
- 각 방향에서 왼쪽 방향은 (direction + 3) % 4로 계산할 수 있다.
- 이동할 때는 dx, dy 리스트를 사용하여 방향에 따른 좌표 변화를 적용한다.
정답 파이썬 코드
N, M = map(int, input().split())
r, c, d = map(int, input().split())
room = [list(map(int, input().split())) for _ in range(N)]
visited = [[0]*M for _ in range(N)]
# 북, 동, 남, 서
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
visited[r][c] = 1 # 현재 위치 청소
count = 1 # 청소한 칸의 수
while True:
clean = False
for _ in range(4):
# 왼쪽 방향으로 회전
d = (d + 3) % 4
nx = r + dx[d]
ny = c + dy[d]
# 청소되지 않은 빈 칸인 경우 전진
if 0 <= nx < N and 0 <= ny < M:
if room[nx][ny] == 0 and visited[nx][ny] == 0:
visited[nx][ny] = 1
count += 1
r, c = nx, ny
clean = True
break
# 네 방향 모두 청소가 이미 되어있거나 벽인 경우
if not clean:
# 후진할 위치 계산
nx = r - dx[d]
ny = c - dy[d]
# 후진할 수 있으면 후진
if 0 <= nx < N and 0 <= ny < M and room[nx][ny] == 0:
r, c = nx, ny
else:
break # 후진할 수 없으면 작동 멈춤
print(count)
핵심 포인트
- 시뮬레이션의 정확한 구현: 문제에서 제시한 로봇 청소기의 동작을 그대로 코드로 구현하는 것이 중요하다.
- 방향 처리:
- 방향을 숫자로 관리하여 회전과 이동을 편리하게 구현한다.
- 왼쪽 회전은 (d + 3) % 4로 계산한다.
- 청소 여부와 벽 판단:
- 방문 배열 visited를 사용하여 청소 여부를 관리한다.
- 방의 상태 room을 사용하여 벽인지 아닌지 판단한다.
- 반복 구조의 이해:
- 청소기가 작동을 멈출 때까지 반복하면서 내부에서 방향 전환과 이동을 처리한다.
도움이 되셨다면 공감과 댓글 부탁드립니다.
728x90
'Python > 백준' 카테고리의 다른 글
백준 스타트와 링크 [14889] 파이썬(Python) 코드 + 해설 (0) | 2024.10.27 |
---|---|
백준 연산자 끼워넣기 [14888] 파이썬(Python) 코드 + 해설 (0) | 2024.10.26 |
백준 연구소 [14502] 파이썬(Python) 코드 + 해설 (1) | 2024.10.24 |
백준 퇴사 [14501] Python 코드 + 해설 (0) | 2024.10.23 |
백준 테트로미노 [14500] Python 코드 + 해설 (0) | 2024.10.22 |