알고리즘 공부/파이썬(Python)

백준 14503번 로봇 청소기 파이썬

마달랭 2024. 7. 6. 22:04
반응형

리뷰

1이 벽이 아니라 청소된 공간으로 이해하여 시간이 꽤 걸렸다.

 

문제 풀이

  1. 모든 입력값을 가져오고 방향을 나타낼 리스트를 초기화 해준다.
  2. 정답을 나타낼 result 변수와 청소가 완료된 상태를 나타낼 배열을 초기화 해준다.
  3. 현재 위치가 청소되지 않은 상태라면 청소된 상태로 바꾸어 주고 result에 1을 더해준다.
  4. 움직일 공간이 있는지를 나타낼 변수를 False 상태로 초기화 해준다.
  5. 방향을 시계 반대 방향으로 90도를 회전하며 해당 방향 앞에 청소 되지 않은 상태인 빈 공간이 있다면 이동한다.
  6. 4방향 모두 청소 되지 않은 빈 공간이 없다면 후진을 하고, 이동할 수 없다면 루프를 종료한다.
  7. result 변수에 저장된 값을 출력한다.

 

참고 사항

방의 가장 북쪽, 가장 남쪽, 가장 서쪽, 가장 동쪽 줄 중 하나 이상에 위치한 모든 칸에는 벽이 있으므로 사실상 맵 밖으로 나가는 일은 없다.

 

정답 코드

def q14503():
    n, m = map(int, input().split())
    r, c, d = map(int, input().split())
    lst = [list(map(int, input().split())) for _ in range(n)]
    dist = [(-1, 0), (0, 1), (1, 0), (0, -1)]
    result = 0
    cleaned = [[False] * m for _ in range(n)]

    while 1:
        if not cleaned[r][c]:
            cleaned[r][c] = True
            result += 1
        cleaned_or_moved = False
        for _ in range(4):
            d = (d + 3) % 4
            nr, nc = r + dist[d][0], c + dist[d][1]
            if 0 <= nr < n and 0 <= nc < m and not cleaned[nr][nc] and lst[nr][nc] == 0:
                r, c = nr, nc
                cleaned_or_moved = True
                break
        if not cleaned_or_moved:
            back = (d + 2) % 4
            br, bc = r + dist[back][0], c + dist[back][1]
            if 0 <= br < n and 0 <= bc < m and lst[br][bc] == 0:
                r, c = br, bc
            else:
                break
    print(result)
q14503()

 

 

728x90
반응형