문제
https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어
www.acmicpc.net
내 풀이
dir를 딕셔너리로 만들고, 문제에서 주어진대로 '북, 동, 남, 서' 방향을 적었다.
현재 방향을 기준으로 왼쪽 방향을 탐색하기 때문에, 현재 방향에서 왼쪽으로 가려면 거꾸로 가야 한다. (ex. 현재 방향이 북쪽인 경우 : 북 -> 서 -> 남 -> 동)
그래서 d = (d - 1) % 4를 해서 왼쪽 방향을 탐색하도록 하였다.
네 방향을 탐색해야 하기 때문에 range(4)로 해서 for문을 돌렸다.
문제에 나와있는 대로 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행하도록 하였다.
1번부터 진행하도록 하려면 다시 위로 올라가야 하는데, 이 경우 flag를 사용하여 확인하였다.
continue에 걸리지 않은 경우는 네 방향 모두 청소가 이미 되어있거나 벽인 경우이므로 후진하거나 작동을 멈추도록 하였다.
import sys
input = sys.stdin.readline
N, M = map(int, input().strip().split())
space = []
r, c, d = map(int, input().strip().split())
for i in range(N):
space.append(list(map(int, input().strip().split())))
dir = {0: (-1, 0), 1: (0, 1), 2: (1, 0), 3: (0, -1)}
ans = 0
while True:
if space[r][c] == 0:
space[r][c] = 2
ans += 1
flag = False
for i in range(4):
d = (d-1) % 4
nr, nc = r + dir[d][0], c + dir[d][1]
if not space[nr][nc]:
r, c = nr, nc
flag = True
break
if flag: continue
nr, nc = r - dir[d][0], c - dir[d][1]
if space[nr][nc] != 1:
r, c = nr, nc
else:
print(ans)
break
총평
분명히 맞게 한 것 같은데, 계속 답이 안나왔다.
답이 안 나온 이유는...
dir의 '3'에 해당하는 튜플을 잘못 적었기 때문이었다. 진짜 똥멍청이...
'알고리즘 > 삼성 기출' 카테고리의 다른 글
퇴사 [백준 14501번] (0) | 2022.09.22 |
---|---|
테트로미노 [백준 14500번] (0) | 2022.09.19 |
연구소 [백준 14502번] (0) | 2022.08.29 |
뱀 [백준 3190번] (0) | 2022.08.29 |
주사위 굴리기 [백준 14499번] (0) | 2022.08.27 |