반응형
https://www.acmicpc.net/problem/14503
문제 설명
문제에서 주어진 것 처럼, 로봇 청소기가 빈공간을 돌아다니며 청소를 한다.
현재 방향을 기준으로 왼쪽 방향부터 탐색을 시작하며,
방향은 0 = 북 / 1 = 동 / 2 = 남 / 3 = 서쪽을 의미한다.
문제에서 주어진 조건과 상황들을 잘 고려하여 코드를 작성해보자.
풀이 과정
먼저 로봇 청소기의 초기 위치는 무조건 0이며 해당 칸을 청소하게 된다.
청소를 한 칸은 2로 변경하여 청소를 했음을 표시해주도록 하자.
그리고 이제 다음과 같이 시뮬레이션을 돌려주자.
① 왼쪽 방향칸을 청소 하지 않았다면(0 이라면)
현재 내 방향(d)를 왼쪽으로 전환하고 한 칸 전진한 후 그 칸을 청소한다.
이 때, 방향은 0 = 북 / 1 = 동 / 2 = 남 / 3 = 서 이므로
왼쪽로의 전환은 (d - 1)%4 를 통해 가능하다.
② 왼쪽 방향에 청소할 공간이 없다면(0 or 1 이라면)
현재 내 방향(d)를 왼쪽으로 전환하고 전진은 하지 않은 상태로 다시 ①단계로 돌아간다.
③ 네 방향 모두 청소가 되어있거나 벽인 경우(0 or 1이라면)
현재 내 방향(d)를 유지한 채로 한 칸 후진하여 ① 단계로 돌아간다.
④ 네 방향 모두 청소가 되어있거나 벽인 경우(0 or 1이라면)
뒤 쪽 방향이 벽(1)이라 후진조차 불가능하다면 작동을 멈춘다.
위 과정을 모두 거친 후, 로봇청소기가 청소한 칸의 갯수를 출력한다.
n, m = map(int, input().split())
r, c, d = map(int, input().split())
board = []
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
answer = 1
for i in range(n):
board.append(list(map(int, input().split())))
def dfs(x, y, depth):
global answer, d
if depth == 4:
nx = x + dx[(d - 2) % 4]
ny = y + dy[(d - 2) % 4]
if board[nx][ny] == 2:
dfs(nx, ny, 0)
else:
print(answer)
exit(0)
nx = x + dx[(d - 1) % 4]
ny = y + dy[(d - 1) % 4]
if board[nx][ny] == 0:
board[nx][ny] = 2
answer += 1
d = (d - 1) % 4
dfs(nx, ny, 0)
elif board[nx][ny] == 1 or board[nx][ny] == 2:
d = (d - 1) % 4
dfs(x, y, depth + 1)
board[r][c] = 2
dfs(r, c, 0)
전체 문제 & 코드는 위의 깃에 정리되어 있습니다.
팔로우 & 맞팔은 환영입니다 !
반응형
'Algorithm > Implementation' 카테고리의 다른 글
[백준] 21610 마법사 상어와 비바라기 (0) | 2021.10.20 |
---|---|
[백준] 14891 톱니바퀴 (Python 파이썬) (0) | 2021.10.19 |
[백준] 14500 테트로미노 (Python 파이썬) (0) | 2021.10.16 |
[백준] 14499 주사위 굴리기 (Python 파이썬) (0) | 2021.10.15 |
[백준] 18870 좌표 압축 (Python 파이썬) (0) | 2021.10.02 |