백준 14503. 로봇 청소기 (Python)

Wjong·2023년 2월 25일
0

baekjoon

목록 보기
5/17

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

풀이

문제설명이 좀 복잡한 문제다.
1. 주변 4칸중 청소되지 않은 빈칸이 있는 경우,

  • a. 현재 바라보고 있는 방향에서 왼쪽으로 회전한다
  • b. 바라보는 앞칸이 청소되지 않고 벽이 아닌경우, 전진한다.
  • c. 바라보는 앞칸이 청소되어있는 칸이거나 벽인경우, a로 돌아간다.

2.주변 4칸중 청소되지 않은 빈칸이 없는경우

  • 현재 바라보는 방향에서 뒤로 1칸 이동이 가능한 경우, 후진한다.
  • 아닐경우(뒤에 벽이있을경우), 청소기 작동중지!

먼저, 지도를 li배열에 담아주고, 똑같은크기의 배열 visit를 만들어준다(청소확인용)
그리고 왼쪽으로 돌아가면서 청소가 가능한 빈칸이 있는지 찾는다.
이때, 방향회전에 주의한다!
시게 반시계방향(북,서,남,동)으로 돌아야하므로
dx,dy의 idx=0,1,2,3 -> 북동남서 에서 idx-=1씩 진행되게 (d+3*i)%4의 계산으로 세팅했다.

N,M=map(int,input().split())
dx,dy=[-1,0,1,0],[0,1,0,-1]  # 0,1,2,3 북동남서
li=[]
visit=[[0]*(M) for i in range(N)]
r,c,d=map(int,input().split())
visit[r][c]=1
res=1
for i in range(N):
    li.append(list(map(int,input().split())))
while True:
    ch=0
    for i in range(1,5):
        nd=(d+3*i)%4 #방향은 계속 바꾸어 주어야한다.
        nx=r+dx[nd]
        ny=c+dy[nd]
        if visit[nx][ny]==0 and li[nx][ny]==0:
            visit[nx][ny]=1
            r,c,d,ch=nx,ny,nd,1
            res+=1
            break
    if ch==0:
        nx=r+dx[d-2]
        ny=c+dy[d-2]
        if li[nx][ny]==0:
            r,c=nx,ny
        else:
            break
print(res)
profile
뉴비

0개의 댓글