삼성 SW 역량 테스트 기출 문제

[Python](구현) 백준 14503번 : 로봇 청소기

Algomalgo 2024. 1. 17. 18:18
728x90


<접근 방법>

"구현" 유형에 속하는 문제는 말 그대로 문제에 쓰여 있는 그대로 구현해 내면 되는 것이 포인트다.

  1. 현재 방의 상태(벽인지 빈칸인지)를 나타낼 arr 이차 배열을 하나 생성하고, 청소를 해나가야 하므로 청소 상태(청소가 되어있는지 안되어있는지)를 나타낼 cleaned 이차 배열을 하나 따로 생성한다.
  2. 현재 칸이 청소되어 있지 않다면 cleaned[si][sj]를 청소처리 해준다.(0 → 1)
  3. 현재 칸 기준 주변 4칸을 살펴보며, 청소되지 않은 칸이 있으면 그 칸으로 이동, 없다면 후진을 해야 하므로
    문제에 써져 있는 그대로 먼저 반시계 방향으로 90도씩 돌면서 다음 칸의 상태를 체크한다.
  4. 청소되지 않은 칸이 발견되면, 즉시 그 칸으로 이동(ni → si, nj → sj)하고 다시 [1]로 돌아가고
    발견되지 않으면 후진을 한다. 후진할 때 뒷 칸이 벽(arr[ni][nj]==1)이라면 반복문을 끝내버린다.

 

N, M = map(int, input().split())
si, sj, d = map(int, input().split())
directions = {0:(-1, 0), 1:(0, 1), 2:(1, 0), 3:(0, -1)}
arr = [list(map(int, input().split())) for _ in range(N)]
cleaned = [[0]*M for _ in range(N)]
area = 0

while True:
    # [1] 현재 칸이 아직 청소되지 않은 경우, 현재 칸 청소
    if not cleaned[si][sj]:
        cleaned[si][sj] = 1
        area += 1

    # [2] 주변 4칸을 돌며 청소되지 않은 빈 칸이 있다면 한 칸 전진 후 break
    for _ in range(4):
        d = (d + 3) % 4     # 먼저 반시계 방향으로 90도 회전 후 판단
        ni = si + directions[d][0]
        nj = sj + directions[d][1]
        if arr[ni][nj] == 0 and not cleaned[ni][nj]:    # 빈 칸이고 청소된 적이 없다면
            si, sj = ni, nj     # 그 칸으로 이동
            break

    # [3] 주변 4칸 모두 청소되지 않은 빈 칸이 없는 경우
    else:
        ni = si - directions[d][0]
        nj = sj - directions[d][1]
        if arr[ni][nj] == 1:    # 후진이 불가능하면(뒷 칸이 벽이면)
            break
        si, sj = ni, nj     # 후진이 가능하면 후진 후 [1]로 돌아가기

print(area)

예제 2번의 cleaned 결과(청소된 구역=1)

이해가 되는 않는 부분이 있으면 질문 주세요. 감사합니다.

728x90