[Python] BOJ 14503 - 로봇 청소기
728x90
반응형
https://www.acmicpc.net/problem/14503
# 2017년도 삼성SW역량 테스트 상반기 문제이다.
# 골드치곤 그냥 하라는 대로 짰더니 바로 맞춰서 쉬운 문제였다.
# 방향 4가지 경우를 나누어주고 2-a, 2-b, 2-c, 2-d경우를 다 나눠서 코드를 짰다.
# 한 가지 고려해야할 요소는 2-d에서 뒤쪽 방향이 '벽인 경우'에만 작동을 멈춰야 한다.
뒤쪽 방향이 청소는 되어있지만, 벽이 아닌 경우 후진은 할 수 있기 때문이다.
따라서 처음에 벽인 곳은 1로 표시하고, 청소한 곳은 2로 표시했다.
import sys
from collections import deque
input = sys.stdin.readline
N, M = map(int,input().split())
r, c, d = map(int,input().split())
m = [list(map(int,input().split())) for _ in range(N)]
dx, dy = [0,0,-1,1], [1,-1,0,0]
cnt = 0
q = deque()
q.append((r, c, d))
while q:
# 1번. 현재 위치 청소
x, y, d = q.popleft()
if m[x][y] == 0:
m[x][y] = 2
cnt += 1
## 2번
tmp = 0
# 네 방향 청소가 이미 되어있거나 벽인 경우 tmp 1증가
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if m[nx][ny] == 1 or m[nx][ny] == 2:
tmp += 1
if tmp == 4:
if d == 0:
# 2-d. 네 방향 모두 청소가 되어있거나 벽이면서 뒤쪽 방향도 벽인 경우 break
if m[x+1][y] == 1:
print(cnt)
break
# 2-c. 뒤쪽 방향이 벽이 아닌경우 후진한 뒤 2번으로 돌아감
else:
q.append((x+1, y, d))
elif d == 1:
# 2-d. 네 방향 모두 청소가 되어있거나 벽이면서 뒤쪽 방향도 벽인 경우 break
if m[x][y-1] == 1:
print(cnt)
break
# 2-c. 뒤쪽 방향이 벽이 아닌경우 후진한 뒤 2번으로 돌아감
else:
q.append((x, y-1, d))
elif d == 2:
# 2-d. 네 방향 모두 청소가 되어있거나 벽이면서 뒤쪽 방향도 벽인 경우 break
if m[x-1][y] == 1:
print(cnt)
break
# 2-c. 뒤쪽 방향이 벽이 아닌경우 후진한 뒤 2번으로 돌아감
else:
q.append((x-1, y, d))
elif d == 3:
# 2-d. 네 방향 모두 청소가 되어있거나 벽이면서 뒤쪽 방향도 벽인 경우 break
if m[x][y+1] == 1:
print(cnt)
break
# 2-c. 뒤쪽 방향이 벽이 아닌경우 후진한 뒤 2번으로 돌아감
else:
q.append((x, y+1, d))
# 네 방향 중 청소해야할 구역이 존재하는 경우(2-a, 2-b)
else:
if d == 0:
# 2-a. 왼쪽 방향에 청소하지 않은 공간이 존재하는 경우 1번으로 돌아감
if m[x][y-1] == 0:
q.append((x, y-1, 3))
# 2-b. 왼쪽 방향에 청소할 공간이 없는 경우 2번으로 돌아감
else:
q.append((x, y, 3))
elif d == 1:
# 2-a. 왼쪽 방향에 청소하지 않은 공간이 존재하는 경우 1번으로 돌아감
if m[x-1][y] == 0:
q.append((x-1, y, 0))
# 2-b. 왼쪽 방향에 청소할 공간이 없는 경우 2번으로 돌아감
else:
q.append((x, y, 0))
elif d == 2:
# 2-a. 왼쪽 방향에 청소하지 않은 공간이 존재하는 경우 1번으로 돌아감
if m[x][y+1] == 0:
q.append((x, y+1, 1))
# 2-b. 왼쪽 방향에 청소할 공간이 없는 경우 2번으로 돌아감
else:
q.append((x, y, 1))
elif d == 3:
# 2-a. 왼쪽 방향에 청소하지 않은 공간이 존재하는 경우 1번으로 돌아감
if m[x+1][y] == 0:
q.append((x+1, y, 2))
# 2-b. 왼쪽 방향에 청소할 공간이 없는 경우 2번으로 돌아감
else:
q.append((x, y, 2))
(solved.ac 티어: 골드 5)
728x90
반응형
'문제풀이 > BaekjoonOnlineJudge' 카테고리의 다른 글
[Python] BOJ 14891 - 톱니바퀴 (0) | 2021.06.26 |
---|---|
[Python] BOJ 19238 - 스타트 택시 (0) | 2021.06.26 |
[Python] BOJ 1504 - 특정한 최단 경로 (0) | 2021.06.22 |
[Python] BOJ 17144 - 미세먼지 안녕! (0) | 2021.06.15 |
[Python] BOJ 16928 - 뱀과 사다리 게임 (0) | 2021.06.15 |
TAGS.