문제 링크

<aside> 💡 구현/시뮬레이션

</aside>

Memory 31256KB Time 40ms Code Length 801B

grid = []
opp_d = [2,3,0,1]
dx = [-1,0,1,0]
dy = [0,1,0,-1]

def clean(x,y,d):
    while True:
        if grid[x][y]==0:
            grid[x][y]=2
    
        if grid[x+1][y]!=0 and grid[x][y+1]!=0 and grid[x-1][y]!=0 and grid[x][y-1]!=0:
            if grid[x+dx[opp_d[d]]][y+dy[opp_d[d]]]==2:
                x+=dx[opp_d[d]]
                y+=dy[opp_d[d]]
            else:
                break
        else:
            if d==0:d=3
            else: d-=1

            if grid[x+dx[d]][y+dy[d]]==0:
                grid[x+dx[d]][y+dy[d]]=2
                x+=dx[d]
                y+=dy[d]

N,M = map(int,input().split())
x,y,d = map(int,input().split())
for _ in range(N):
    grid.append(list(map(int,input().split())))

clean(x,y,d)

cnt = 0
for line in grid:
    cnt+=line.count(2)
print(cnt)

이 코드는 로봇 청소기의 작동 원리를 나타낸 것이다.

먼저, grid는 로봇 청소기가 청소할 공간을 나타내며, opp_d, dx, dy는 로봇 청소기의 방향을 조절하는데 사용된다.

clean(x,y,d) 함수는 로봇 청소기가 청소를 수행하는 기능을 한다. 이 함수는 로봇 청소기가 현재 위치에서 청소를 하고, 그 다음으로 청소할 위치를 결정한다.

로봇 청소기는 현재 위치에서 사방이 모두 청소가 되어있거나 벽인 경우에는 바라보는 방향을 유지한 채로 한 칸 후진한다. 그리고 후진한 위치가 벽이 아니면 청소를 계속하고, 벽이면 작동을 멈춘다.

사방 중 청소하지 않은 공간이 있다면, 현재 바라보는 방향을 기준으로 왼쪽 방향부터 탐색하여 청소를 진행한다.

마지막으로, 로봇 청소기가 청소한 칸의 개수를 세어 출력한다. 이를 위해 grid를 순회하며 청소한 칸(값이 2인 칸)의 개수를 센다.