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

 

14503번: 로봇 청소기

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

www.acmicpc.net

접근

문제에서 요구하는 대로 코드를 단순하게 구현하였다.

현재 위치와 방향을 받아 현재 위치를 청소 완료되었다고 표시하고, 현재 방향을 기준으로 4방향을 탐색하여 청소 안된 곳이 있을 경우 이동, 없을 경우 후진, 마지막으로 이동한 위치와 방향을 리턴하는 clean 함수를 작성하여 문제를 해결하였다.

코드

N, M = map(int, input().split())
r, c, d = map(int, input().split())
matrix = []
for _ in range(N):
    matrix.append(list(map(int, input().split())))
rc = [-1, 0, 1, 0]
cc = [0, 1, 0, -1]


def clean(r, c, d, cnt):
    # 현재 위치가 청소되어있지 않다면 청소
    if matrix[r][c] == 0:
        cnt += 1
        matrix[r][c] = 2
    for i in range(1, 5):
        # 현재 방향을 기준으로 왼쪽 방향 순서대로 탐색하여 청소되지 않은 공간이 있을 경우 이동
        di = (d - i) % 4
        nr, nc = r + rc[di], c + cc[di]
        if matrix[nr][nc] == 0:
            return 1, cnt, nr, nc, di
    # 4방향 모두 청소가 완료되었을 경우, 새로 이동하는 위치는 후진
    nr, nc = r + rc[(d + 2) % 4], c + cc[(d + 2) % 4]
    if matrix[nr][nc] == 1:
        # 후진 시, 뒤가 벽일 경우 작동 중지를 뜻하는 0 리턴
        return 0, cnt, r, c, d
    else:
        # 후진 시, 뒤가 벽이 아닐 경우 후진한 위치 및 방향을 리턴
        return 1, cnt, nr, nc, d


flag = 1
cnt = 0
while flag:
    # clean 함수에서 작동 중지를 뜻하는 flag = 0 이 리턴될 때 까지 계속 반복
    flag, cnt, r, c, d = clean(r, c, d, cnt)
print(cnt)

더 생각해 볼 것?

...

코드나 내용 관련 조언, 부족한 점 및 질문 언제든 환영합니다!

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기