알고리즘 분류)
시뮬레이션 문제로 각각의 명령에 따라 어떻게 오류없이 구현해내는지가 중요하다
간결한 숏코딩이나 문맥성이 있다면 좋은 코드일 것 같다
각 명령에 의해 코드를 구현한 방법을 정리하자면 이렇다
d 딕셔너리)
d = {0:[-1,0],3:[0,-1],2:[1,0],1:[0,1]}
key : 바라보는방향, value : 이동할 인덱스 를 저장한 딕셔너리
turn함수)
def turn(): #왼쪽으로 방향전환
global look,cnt
if look==0:
look=3
elif look==3:
look=2
elif look==2:
look=1
elif look==1:
look=0
cnt += 1
move함수)
def move(): #보고있는 방향으로 이동
global r,c,look
r,c = r+d[look][0] , c+d[look][1]
back함수)
def back(): #보고있는 방향 뒤로 이동
global r,c,look
r,c = r-d[look][0] , c-d[look][1]
import sys
global r,c,look,cnt
def move(): #보고있는 방향으로 이동
global r,c,look
r,c = r+d[look][0] , c+d[look][1]
def back(): #보고있는 방향 뒤로 이동
global r,c,look
r,c = r-d[look][0] , c-d[look][1]
def turn(): #왼쪽으로 방향전환
global look,cnt
if look==0:
look=3
elif look==3:
look=2
elif look==2:
look=1
elif look==1:
look=0
cnt += 1
N,M = map(int,input().split())
r,c,look = map(int,input().split())
array = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]
d = {0:[-1,0],3:[0,-1],2:[1,0],1:[0,1]}
cnt=0
while True:
array[r][c] = 'X' #청소한곳 표시
if cnt==4: #4번 회전했다면
if array[r-d[look][0]][c-d[look][1]]==1: #뒤쪽이 벽이면
break
back() #뒤로이동한다
cnt=0 #회전초기화
if look==0: #북쪽을 보고있을 시
if array[r][c-1] == 0:
turn()
move()
cnt=0
continue
else:
turn()
continue
elif look==3: #서쪽을 보고있을 시
if array[r+1][c] == 0:
turn()
move()
cnt=0
continue
else:
turn()
continue
elif look==2: #남쪽을 보고있을 시
if array[r][c+1] == 0:
turn()
move()
cnt=0
continue
else:
turn()
continue
elif look==1: #동쪽을 보고있을 시
if array[r-1][c] == 0:
turn()
move()
cnt=0
continue
else:
turn()
continue
#청소된곳 개수 세기
total=0
for i in range(N):
for j in range(M):
if array[i][j] == 'X':
total+=1
print(total)
너무 길다 ..