백준 / 로봇청소기 / 14503

박성완·2022년 4월 12일
0

백준

목록 보기
65/78
post-thumbnail

Question

문제링크
Gold 5

Logic

기본 구조 : loop
1. 반복문 내에서 문제의 내용을 그대로 구현한다.
2. 입력된 배열을 2차원 리스트로 저장한다.
3. 인덱스 변수 i,j와 회전 변수 d를 둔다.
4. 좌회전/후진은 각 경우별로 더할 인덱스를 2차원 리스트로 저장해놓는다.
5. 우선 현위치에서 청소가 가능하다면 청소를 하고, 카운드를 증가시킨다.
6-1. 그 다음 왼쪽 위치의 블럭이 청소가 가능하다면 회전 후 움직인다.
6-2. 왼쪽 위치가 청소가 불가능하다면 회전만한다. 이때, 회전한 수를 카운트하고, 4가 되는 순간 회전변수를 초기화하고, 후진이 불가하다면 중간 변수를 이용해 반복문 탈출, 그 외엔 후진을 한다.

Code

from sys import stdin
N,M = map(int,stdin.readline().rstrip().split())
r,c,d = map(int,stdin.readline().rstrip().split())
data = [stdin.readline().rstrip().split() for _ in range(N)]

clean = 0
i,j = r,c
rotate = 0
direc = [[0,-1],[-1,0],[0,1],[1,0]]
back = [[1,0],[0,-1],[-1,0],[0,1]]
finished=False

while True:
    if data[i][j]=='0':
        data[i][j]='2'
        clean+=1
    lefti,leftj = i+direc[d][0],j+direc[d][1]
    if (data[lefti][leftj]=='0'):
        rotate = 0
        if d==0: d=3
        else : d -= 1
        i,j = lefti,leftj
    else:
        rotate += 1
        if d==0: d=3
        else : d -= 1
        if rotate == 4:
            rotate = 0
            backi,backj = i+back[d][0],j+back[d][1]
            if data[backi][backj]=='1':
                finished = True
            else:
                i,j = backi,backj
    if finished : break
print(clean)

0개의 댓글