728x90
https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$ 둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽
www.acmicpc.net
난이도: 골드5
알고리즘: 단순구현
풀이과정
주어진 조건에 맞게 구현만 잘 하면 된다.
헷갈리지 말하야 할 점은 로봇의 상, 하, 좌, 우 중에 청소하지 않은 부분이 있을 때, 현재 방향부터가 아닌 현재 방향의 반시계 방향부터 탐색해야 한다.
먼저 status
에 현재 청소기의 행, 열, 방향 정보를 저장한다.
while문을 반복하며 현재 status의 위치를 청소한다. (board[y][x]
= 2)
현재 칸에서 반시계방향부터 조사하며 상하좌우에 청소하지 않은 칸이 있는지 조사한다.
만약 청소를 하지 않은 칸이 있다면 status
를 갱신하고 청소한 칸 수를 1 늘리고 위 과정을 다시 반복한다.
상하좌우 모두 청소를 한 칸이라면 현재 방향의 반대방향으로 1칸 이동한 위치로 status
를 갱신한다. 이 때 반대방향으로 이동할 수 없다면 while문을 탈출한다.
위 반복문에서 센 청소한 칸 수를 출력한다.
소스코드
from sys import stdin
N, M = map(int, stdin.readline().split())
board = [[0 for _ in range(M)] for _ in range(N)]
r, c, d = map(int, stdin.readline().split())
for i in range(N):
row = list(map(int, stdin.readline().split()))
for j in range(M):
board[i][j] = row[j]
# 북, 동, 남, 서
dr = [-1, 0, 1, 0]
dc = [0, 1, 0, -1]
status = (r, c, d)
count = 1
while True:
cur_r, cur_c, cur_d = status
board[cur_r][cur_c] = 2 # 현재 칸을 청소
all_clean_flag = False
for i in range(4):
# 현재 방향부터 반시계 방향으로 탐색
cur_d = (cur_d + 3) % 4
nr = cur_r + dr[cur_d]
nc = cur_c + dc[cur_d]
if 0 <= nr < N and 0 <= nc < M:
if board[nr][nc] == 0:
status = (nr, nc, cur_d)
count += 1
break # 방향이 결정되면 이동
if i == 3:
all_clean_flag = True
if all_clean_flag:
# 한 칸 후진
nr = cur_r - dr[cur_d]
nc = cur_c - dc[cur_d]
if 0 <= nr < N and 0 <= nc < M and board[nr][nc] != 1:
status = (nr, nc, cur_d)
# 벽이 있어 후진을 못 한다면 종료
else:
break
print(count)
728x90
'알고리즘' 카테고리의 다른 글
[백준] 16234. 인구 이동 - python (0) | 2024.03.28 |
---|---|
[백준] 2812. 크게 만들기 - python (0) | 2024.03.26 |
[백준] 14502. 연구소 - python (0) | 2024.03.25 |
[백준] 3109. 빵집 - python (0) | 2024.03.25 |
[백준] 15684. 사다리 조작 - python (0) | 2024.03.24 |