14503 - 로봇 청소기
info
- 문제 보기: 14503 - 로봇 청소기
- 소요 시간: 💥1시간 6분
- 풀이 언어:
python
- 체감 난이도: 3️⃣
- 리뷰 횟수: ✅
풀이 키워드
스포주의
구현
풀이 코드
info
- 메모리: 31120 KB
- 시간: 36 ms
import sys
input = sys.stdin.readline
dy = [-1, 0, 1, 0] # 북 동 남 서
dx = [0, 1, 0, -1]
def solution():
n, m = map(int, input().split())
r, c, d = map(int, input().split())
room = [0] * (n)
for i in range(n):
room[i] = list(map(int, input().split()))
ans = 1 # 맨 처음 위치를 청소하고 시작
room[r][c] = -1
y, x = r, c
while True:
cleaned = False
for _ in range(4):
d = (d + 3) % 4 # 반시계 회전
ny = y + dy[d]
nx = x + dx[d]
if room[ny][nx] == 0: # 3. 청소 안되어있음
room[ny][nx] = -1
ans += 1 # 청소하고
y, x = ny, nx
cleaned = True
break # 이동 후 다시 4방향 탐색
if not cleaned: # 2. 4방향 다 청소할 곳 없음
ty = y - dy[d]
tx = x - dx[d]
if room[ty][tx] == 1: # 후진했는데 벽일 경우
return ans
else:
y, x = ty, tx
if __name__ == '__main__':
print(solution())
풀이 해설
두 가지 사항이 중요한 문제이다.
- 방향 전환 구현
- 문제에 작성된 조건의 적절한 로직화
방향 전환은 방향 벡터 느낌으로 구현하면 되고
방향 전환을 인덱스로 조정하되, 순환하므로 modulo를 활용한다.
dy = [-1, 0, 1, 0] # 북 동 남 서
dx = [0, 1, 0, -1]
d = (d + 3) % 4 # 반시계 회전
ny = y + dy[d]
nx = x + dx[d]
조건의 로직화는 약간 머리를 굴려야 한다.
우선 주어진 조건을 읽어보면 다음과 같다.
- 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
- 현재 칸의 주변 칸 중 청소되지 않은 빈 칸이 없는 경우,
- 바라보는 방향을 유지한 채로 한 칸 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.
- 바라보는 방향의 뒤쪽 칸이 벽이라 후진할 수 없다면 작동을 멈춘다.
- 현재 칸의 주변 칸 중 청소되지 않은 빈 칸이 있는 경우,
- 반시계 방향으로 회전한다.
- 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진한다.
- 1번으로 돌아간다.
여기서 1번은 그리 중요한 조건이 아니다. 왜냐하면 3번에서 칸 이동 후 처리하면 되기 때문이다.
따라서 2, 3번이 분기문으로 구현해야 하는 주요 조건이다.
이 부분만 캐치하면 나머지는 그럭저럭...
메모
- ㅁㄴㅇㄹ