티스토리 뷰

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

 

14503번: 로봇 청소기

첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$  둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽

www.acmicpc.net


1. 풀이

  • 지문을 똑바로 읽자...

문제 조건을 제대로 확인해야 한다. 실제 이 문제의 질문 게시판을 보면 문제를 이해하지 못해서 많은 분들이 실수했단 걸 알 수 있다.

 

      ✅ 0은 빈 칸, 1은 벽 ⇒ 청소했다는 표시는 0이나 1이 아닌 다른 숫자(예를 들면 2)를 통해 나타내야 한다.
     벽과 달리, 청소한 칸은 후진할 수 있다. ⇒ 따라서 현재 (i, j)가 0인지 아닌지를 확인하고 count 해야 한다.
      ✅ 현재 칸의 주변 4칸에 청소되지 않은 빈 칸이 있다면, 일단 무조건 현재 방향에서 반시계 방향으로 90도 회전해야 한다. 즉, 현재 (i, j) 위치에서 북쪽 방향일 때 (i - 1, j)가 빈 칸이더라도, 일단 서쪽으로 회전부터 해야 한다!

 

위 조건대로 로봇이 청소하는 과정은 다음과 같다.

 

정답은 3!

 

문제를 제대로 이해하지 못해서 많이 헤맸다. 꼼꼼하게 문제 지문을 읽고, 기록을 해두어야 나중에 코드를 작성하면서 길을 잃지 않다는 걸 알고 있는데, 이번엔 왜 그랬을까? 문제를 읽으면서 아아~~ 그래~~ 하면서 문제를 파악했다고 생각하고, 빨리 코드를 작성하고 싶어서 서둘렀던 게 화근이었던 것 같다.

 

 

  • 현재 위치에서 주변 4칸 중에 청소되지 않은 빈 칸이 존재하는지 확인하는 함수를 작성하자

회전하기에 앞서, 일단 주변에 빈 칸이 있는지 없는지부터 확인해야 한다. 두 가지 경우에 따라, 진행해야 할 로직이 달라지기 때문이다. 이때 청소되지 않은 빈 칸은 1임을 명심하자. 청소한 칸 (2)으로 이동할 수는 있지만, 청소할 수는 없다.

 

 

 

2. 정답 코드

import sys

input = sys.stdin.readline
DIRECTIONS = [(-1, 0), (0, 1), (1, 0), (0, -1)]  # 북, 동, 남, 서


def validate_position(x, y):
    return False if x < 0 or x >= N or y < 0 or y >= M else True


def Exists(x, y):  # check is room to clean exists
    for direction in DIRECTIONS:
        dx, dy = x + direction[0], y + direction[1]
        if validate_position(dx, dy) and maps[dx][dy] == 0:
            return True
    return False


def clean_rooms(x, y, direction):
    count = 0
    while True:
        if maps[x][y] == 0:
            count += 1
        	maps[x][y] = 2  # clean current room

        if Exists(x, y):
            for i in range(1, 5):
                index = (direction - i) % 4
                dx, dy = x + DIRECTIONS[index][0], y + DIRECTIONS[index][1]

                if not validate_position(dx, dy):
                    continue

                if maps[dx][dy] == 0:
                    direction = index
                    x, y = dx, dy
                    break
        else:
            dx, dy = x - DIRECTIONS[direction][0], y - DIRECTIONS[direction][1]
            if not validate_position(dx, dy) or maps[dx][dy] == 1:
                return count
            x, y = dx, dy  # maps[x][y] could be 2 or 0


N, M = map(int, input().split())
r, c, d = map(int, input().split())
maps = [list(map(int, input().split())) for _ in range(N)]

answer = clean_rooms(r, c, d)
print(answer)
728x90