본문 바로가기

알고리즘/삼성 기출

로봇 청소기 [백준 14503번]

문제

 

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