-
백준 14503) 로봇청소기 (골드.5)알고리즘 2022. 8. 2. 19:03
https://www.acmicpc.net/problem/14503
시뮬레이션 유형의 문제이다. 문제의 조건은 다음과 같다.
1) 청소기가 바라보는 방향은 북동남서의 순서로 나타낸다.
2) 청소기가 바라보는 방향에 청소할 곳이 없거나 벽이면 왼쪽으로 회전한다.
3) 바라보는 방향에 청소할 곳이 있으면 이동하여 청소하고 해당 방향에서 반복한다.
4) 청소할 곳이 없으면 바라보는 방향을 유지하고 한칸 후진하여 해당 위치에서 반복한다.
5) 청소할 곳이 없고 후진하는 방향이 벽이라 후진이 불가능하면 청소를 종료한다.
여기서 주의할 것이 주어지는 방향과 청소기가 회전할 방향(북 -> 서 -> 남-> 동)이 다르다는 것과 후진하는 방향이 벽일 때가 후진이 불가능하고 청소가 완료된 칸이면 후진이 가능하다는 것이다.
우선 바라보는 방향을 d에서 정의한 방향에 맞게 정해놓고 후진의 경우 d[(direction+2)%4]를 이용하여 방향을 바꾸도록 하였다.
import sys global n, m, board, d, y, x, answer answer = 0 n, m = map(int, sys.stdin.readline().split()) board = [[] for _ in range(n)] d = [ (-1, 0), (0, -1), (1, 0), (0, 1)] y, x, direction = map(int, sys.stdin.readline().split()) if direction == 1 : direction = 3 elif direction == 3: direction = 1 for i in range(n): board[i].extend(list(map(int, sys.stdin.readline().split()))) def cleaning(direction): global n, m , board, d, y, x, answer if board[y][x] == 0 : board[y][x] = 2 answer +=1 while True : isDirty = False for _ in range(4) : direction = (direction+1) %4 ny = y + d[direction][0] nx = x + d[direction][1] if ny<=0 or ny>=n-1 or nx<=0 or nx>=m-1 or board[ny][nx] == 1 or board[ny][nx] == 2: continue y = ny x = nx answer += 1 board[y][x] = 2 isDirty = True break if not isDirty : if board[y + d[(direction + 2)%4][0]][x + d[(direction + 2)%4][1]] == 1: break else : y += d[(direction + 2)%4][0] x += d[(direction + 2)%4][1] cleaning(direction) print(answer)
'알고리즘' 카테고리의 다른 글
백준 14891) 톱니바퀴 (골드.5) (0) 2022.08.02 백준 16234) 인구이동 (골드.5) (0) 2022.08.02 백준 15686) 치킨배달 (골드.5) (0) 2022.08.02 백준 17140) 이차원 배열과 연산 (골드.4) (0) 2022.08.02 백준 12865) 평범한 배낭 (골드.5) (0) 2022.07.20