[Python] 백준 / gold / 14503 : 로봇 청소기

김상우·2021년 11월 23일
0

문제 링크 : https://www.acmicpc.net/problem/14503

구현 + 재귀 문제. 이렇게 스텝을 친절하게 알려주는 문제는 그냥 스텝 따라 코드 짜서 정답 나오면 좋은데 생각을 좀 해야되는 문제였다.

스텝 1이 "현재 위치를 청소한다" 라서 재귀의 시작을 청소로 구현했었는데, 후진하고 2번으로 다시 돌아가는 로직을 다시 구현하기가 까다로웠다. "현재 위치를 아직 청소하지 않았으면" 이라는 나만의 조건을 추가하고, 2번으로 돌아가는게 아니라 아예 재귀를 수행하도록 해줬더니 잘 풀렸던것 같다.


파이썬 코드

import sys

N, M = map(int, sys.stdin.readline().split())
r, c, d = map(int, sys.stdin.readline().split())
answer = 0

direction = [(-1,0), (0,1), (1,0), (0,-1)]  # 북 동 남 서
clean = [[False] * M for _ in range(N)]
graph = []
for _ in range(N):
    graph.append(list(map(int, sys.stdin.readline().split())))


def robotCleaner(x, y, d):
    #print('x y',x,y)
    if not clean[x][y]:
        clean[x][y] = True
        global answer
        answer += 1

    dCheck = 0
    for _ in range(4):
        nextD = d - 1
        if nextD == -5:
            nextD = 3

        nx = x + direction[nextD][0]
        ny = y + direction[nextD][1]

        # 2-a
        if 0 <= nx < N and 0 <= ny < M and not clean[nx][ny] and graph[nx][ny] == 0:
            robotCleaner(nx, ny, nextD)
            return

        dCheck += 1
        d = nextD

    if dCheck == 4:
        bx = x - direction[nextD][0]
        by = y - direction[nextD][1]
        if not graph[bx][by] == 1:
            robotCleaner(bx,by,nextD)
        else:
            return


robotCleaner(r,c,d)
print(answer)
profile
안녕하세요, iOS 와 알고리즘에 대한 글을 씁니다.

0개의 댓글