Algorithm (PS)

[백준] 14503 로봇청소기 in Python

minjiwoo 2022. 10. 23. 23:48
728x90

https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net

2차원배열에서의 회전할때 규칙과, 후진할 때 칸의 이동을 찾으면 풀 수 있는 시뮬레이션 문제이다 

n, m = map(int, input().split())
r, c, d = map(int, input().split())
array = []
visited = [[False]*m for _ in range(n)] # 청소한 여부 기록
visited[r][c] = True # 방문처리
count = 1
dx = [-1, 0, 1, 0] # 북 동 남 서
dy = [0, 1, 0, -1]

for _ in range(n):
    array.append(list(map(int, input().split())))

# 왼쪽방향으로 돌리기
# 북쪽 방향일 때 왼쪽은 서쪽이 됨 (index 0 -> 3)
# 동쪽 방향일 때 왼쪽은 북쪽이 됨 (index 1 -> 0)
# 남쪽 방향일 때 왼쪽은 동쪽이 됨 (index 2 -> 1)
# 서쪽 방향일 때 왼쪽은 남쪽이 됨 (index 3 -> 2)
def turn_left():
    global d
    d -= 1
    if d == -1:
        d = 3
turn_time = 0 # 회전 횟수
while True:
    turn_left() # 왼쪽 회전
    nx = dx[d] + r
    ny = dy[d] + c
    if array[nx][ny] == 0 and not visited[nx][ny]:
        visited[nx][ny] = True # 방문
        r = nx
        c = ny # 갱신
        count += 1
        turn_time = 0 # 다시 초기화
        continue
    else:
        turn_time += 1

    if turn_time == 4: # 후진하기
        nx = r - dx[d]
        ny = c - dy[d]
        if array[nx][ny] == 1:
            break
        else:
            r = nx
            c = ny
            turn_time = 0
print(count)
728x90