문제
https://www.acmicpc.net/problem/14503
풀이
주어진 지문을 그대로 구현하려고 노력했다.
다만 지문에 큰 오류가 있다.
지문의 "현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우"은 이미 청소를 한 구역이어도 지나갈 수 있다.
청소를 한 곳을 다시 방문하지 않게 코딩을 하다가 테스트 케이스를 통과하지 못해서 너무나도 고생했다....
실제로 아래 짠 코드도 중복되는 코드도 많고, 주변 4칸을 탐색할 때 가야할 방향을 저장하는 방법을 잘 짜놨다면 아래 코드처럼 더럽게 나오지는 않았을 것이다. 여러분들은 더 좋은 코드를 만들 수 있을 것이다.
코드
# 14503번 로봇 청소기
n, m = map(int, input().split())
c_x, c_y, dir = map(int, input().split())
grid = [list(map(int, input().split())) for _ in range(n)]
ans = 0
# dir 북 동 남 서
dxys = ((1,0), (0,-1), (-1,0), (0,1))
while 1:
# 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
if grid[c_x][c_y] == 0:
grid[c_x][c_y] = 2
ans += 1
flag = 1
for dx, dy in dxys:
n_x = c_x + dx
n_y = c_y + dy
if 0 <= n_x < n and 0 <= n_y < m:
# 현재 칸의 주변 4칸 청소안한 칸이 존재하는 경우
if grid[n_x][n_y] == 0:
flag = 0
break
# 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우,
if flag == 1:
t_x = c_x + dxys[dir][0]
t_y = c_y + dxys[dir][1]
if 0 <= t_x < n and 0 <= t_y < m:
# 바라보는 방향을 유지한 채로 한 칸 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.
# 바라보는 방향의 뒤쪽 칸이 벽이라 후진할 수 없다면 작동을 멈춘다.
if grid[t_x][t_y] == 1:
break
else:
c_x = t_x
c_y = t_y
# 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는 경우,
else:
# 반시계 방향으로 90도 회전한다.
for _ in range(4):
dir = (dir-1)%4
t_x = c_x - dxys[dir][0]
t_y = c_y - dxys[dir][1]
if 0 <= t_x < n and 0 <= t_y < m:
# 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진한다.
if grid[t_x][t_y] == 0:
c_x = t_x
c_y = t_y
break
print(ans)
출력결과
'백준 > 구현' 카테고리의 다른 글
[백준][Python] 1972번 놀라운 문자열 - 실버 3 (0) | 2024.05.16 |
---|---|
[백준][Python] 13717번 포켓몬 GO - 실버 5 (0) | 2024.03.24 |
[백준][Python] 2493번 탑 - 코팩 (0) | 2024.01.02 |
[백준][PyPy3] 1062번 가르침 - 코팩 (0) | 2023.08.31 |
[백준][Python] 2776번 암기왕 - 코팩 (0) | 2023.08.30 |