삼성 SW 역량 테스트 기출 문제
[Python](구현) 백준 14503번 : 로봇 청소기
Algomalgo
2024. 1. 17. 18:18
728x90
<접근 방법>
"구현" 유형에 속하는 문제는 말 그대로 문제에 쓰여 있는 그대로 구현해 내면 되는 것이 포인트다.
- 현재 방의 상태(벽인지 빈칸인지)를 나타낼 arr 이차 배열을 하나 생성하고, 청소를 해나가야 하므로 청소 상태(청소가 되어있는지 안되어있는지)를 나타낼 cleaned 이차 배열을 하나 따로 생성한다.
- 현재 칸이 청소되어 있지 않다면 cleaned[si][sj]를 청소처리 해준다.(0 → 1)
- 현재 칸 기준 주변 4칸을 살펴보며, 청소되지 않은 칸이 있으면 그 칸으로 이동, 없다면 후진을 해야 하므로
문제에 써져 있는 그대로 먼저 반시계 방향으로 90도씩 돌면서 다음 칸의 상태를 체크한다. - 청소되지 않은 칸이 발견되면, 즉시 그 칸으로 이동(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)
이해가 되는 않는 부분이 있으면 질문 주세요. 감사합니다.
728x90