티스토리 뷰
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)가 빈 칸이더라도, 일단 서쪽으로 회전부터 해야 한다!
위 조건대로 로봇이 청소하는 과정은 다음과 같다.
문제를 제대로 이해하지 못해서 많이 헤맸다. 꼼꼼하게 문제 지문을 읽고, 기록을 해두어야 나중에 코드를 작성하면서 길을 잃지 않다는 걸 알고 있는데, 이번엔 왜 그랬을까? 문제를 읽으면서 아아~~ 그래~~ 하면서 문제를 파악했다고 생각하고, 빨리 코드를 작성하고 싶어서 서둘렀던 게 화근이었던 것 같다.
- 현재 위치에서 주변 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)
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준] 16234번 인구 이동 파이썬 풀이 (0) | 2024.03.19 |
---|---|
[백준] 3190번 뱀 파이썬 풀이 (0) | 2024.03.16 |
[백준] 14502번 연구소 파이썬 정답 풀이 (0) | 2024.03.14 |
[백준] 15686번 치킨 배달 파이썬 풀이 (0) | 2024.03.13 |
[백준] 2294번 동전 2 파이썬 정답 풀이 (0) | 2024.03.09 |