문제 출처 : https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

🔥 작성코드

N, M = map(int, input().split())
si, sj, d = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]

# 입력받은 d는 시계방향 (북, 동, 남, 서 => 북, 서, 남, 동)
if d%2:
    d = (d+2)%4

# 반시계 방향으로 북, 서, 남, 동
di = [-1, 0, 1, 0]
dj = [0, -1, 0, 1]

# 시작지점 청소
arr[si][sj] = 2
cnt = 1

flag = 0
while True:
    if flag == -1:
        break

    # 현재 방향(d)에서 왼쪽으로 돌며 확인
    for k in range(d+1, d+5):
        c = k%4
        ni = si + di[c]
        nj = sj + dj[c]

        # 청소할 영역이 있으면 청소
        if 1 <= ni < N-1 and 1 <= nj < M-1 and arr[ni][nj] == 0:
            arr[ni][nj] = 2
            si = ni
            sj = nj
            d = c
            cnt += 1
            break

    # 4방향 모두 청소할 구역이 없다면 뒤로가거나 종료
    else:
        ni = si - di[d]
        nj = sj - dj[d]
        if ni < 1 or ni >= N-1 or nj < 1 or nj >= M-1 or arr[ni][nj] == 1:
            flag = -1
        else:
            si = ni
            sj = nj

print(cnt)

 

⭕ 해설

  1. 입력받은 방향을 북, 동, 남, 서에서 북, 서, 남, 동으로 바꾸어줍니다.
  2. 시작지점을 청소합니다.
  3. while문을 돌면서 해당 방향에서 왼쪽부터 청소할 영역이 있는지 확인합니다.
    • 청소할 곳이 있다면 방향을 돌리고 이동하고 청소합니다.
    • 청소할 곳이 없다면 한 칸 뒤로 갑니다. (방향은 그대로)
    • 뒤로 갈 곳이 없다면 종료합니다. (벽으로 막혀있다면 flag를 -1로 바꾸어 종료)

+ Recent posts