코딩테스트/삼성 기출

백준 14503 로봇 청소기 파이썬 풀이 및 코드 (시뮬레이션 문제)

RyanKwon 2022. 10. 7. 23:51
728x90

 

코드는 여기. 해설 및 잡설은 아래로..

N, M = map(int, input().split())

r, c, dir = map(int, input().split())

grid = []
for i in range(N):
    grid.append(list(map(int, input().split())))

# if 청소 : 2

start = [r, c, dir]

stack = [start]
answer = 0

dir = [[-1, 0], [0, 1], [1, 0], [0, -1]]


def next_dir(grid, y, x, d):
    ny, nx = 0, 0
    # dir = [[-1, 0], [0, 1], [1, 0], [0, -1]]
    for i in range(4):
        next_dir = (d+3)%4
        dy, dx = dir[next_dir]
        ny, nx = y+dy, x+dx
        if grid[ny][nx] == 0:
            return [ny, nx, next_dir]
        d = next_dir
    return [0]

while stack:
    answer += 1
    cur = stack[0]
    stack = []
    y, x, d = cur[0], cur[1], cur[2]
    # print(y, x)
    grid[y][x] = 2  #현재 칸 청소

    while True:
        stack.append(next_dir(grid, y, x, d))#다음 이동할 구간 확인. 있으면 밖으로
        if len(stack[0]) == 3: 
            break
        else : #없으면
            stack = []
            tmp_dir = (d+2)%4
            dy, dx = dir[tmp_dir]
            ny = y + dy
            nx = x + dx  #뒤로
            if grid[ny][nx] == 1:
                break
            elif grid[ny][nx] == 2:
                y, x = ny, nx
            else:
                stack.append([ny, nx, d])
                break


print(answer)

 

- 문제를 정확히 이해하고 풀면 된다.

 

- 헷갈렸던 부분은, 뒤로 다시 갈 때 방향이 어떻게 되는지?가 조금 헷갈렸다.

     - 뒤로 한칸 간 뒤 다시 처음 규칙으로 주변을 탐색하고 주변에 갈 곳이 없으면 그대로 또 뒤로 한칸 가야함.

 

- 나는 풀면서 조금씩 조건을 추가하는 방식으로 풀었는데, 솔직히 문제를 제대로 완전히 이해하지 않고 풀어서 조금 헤맸다. 

 

****** 시뮬레이션 문제 풀때 팁 *******

- 문제를 먼저 정확히 이해하고 풀 것. 풀면서 수정하는게 더 복잡하고 어렵고 수정하기 힘들다

 

 

+ 잡담 ) 두시간넘게 자꾸 틀려서 처음부터 새로 짯는데, 생각해보니 디버깅과정에서 넣은 print때문인거같아서 뺏더니 답이 나왔다 ,, 하....

728x90