<이것이 취업을 위한 코딩 테스트다>를 공부하며 정리한 내용입니다.
맵의 각 칸은 (A, B)로 나타낼 수 있고, A는 북쪽으로부터 떨어진 칸의 개수, B는 서쪽으로부터 떨어진 칸의 개수이다. 캐릭터는 상하좌우로 움직일 수 있고, 바다로 되어 있는 공간에는 갈 수 없다.
캐릭터의 움직임을 설정하기 위해 정해 놓은 매뉴얼은 이러하다.
현민이는 위 과정을 반복적으로 수행하면서 캐릭터의 움직임에 이상이 있는지 테스트하려고 한다. 매뉴얼에 따라 캐릭터를 이동시킨 뒤에, 캐릭터가 방문한 칸의 수를 출력하는 프로그램을 만드시오.
4 4
1 1 0
1 1 1 1
1 0 0 1
1 1 0 1
1 1 1 1
3
n, m= map(int, input().split())
a, b, d= map(int, input().split())
mapp=[]
for i in range(n):
mapp.append(list(map(int, input().split())))
cnt=1 #방문한 칸의 수..! (현재 있는 곳도 포함.)
all4=0 #한 칸에서 몇 개의 방향을 살폈는지
#북, 동, 남, 서 순으로 각 방향을 바라보았을때 앞쪽 좌표로 가는 법
go=[(-1,0),(0,1),(1,0),(0,-1)]
while True:
#왼쪽 방향
dl=((d-1)%4)
#다음 행동 지정
nex0=go[dl][0]
nex1=go[dl][1]
nex=mapp[a+nex0][b+nex1]
print(nex)
#왼쪽 방향에 가보지 않은 칸이 있다면 그곳으로 먼저 전진
if nex==0:
mapp[a][b]=2 #가봤다고 표시하기
a+=nex0
b+=nex1
cnt+=1
all4=0
else: #안 갔다면
all4+=1 #살펴보기만 했다고 표시
d=dl#왼쪽으로 방향 회전해주기
if all4==4: #네 방향 모두 살핀 경우
#앞으로 전진할 때의 좌표 변화
r0=go[d][0]
r1=go[d][1]
if mapp[a-r0][b-r1]==1: #뒤의 칸이 바다냐?
break
else: #그렇지 않다면 뒤로 가기
mapp[a][b]=2 #가봤다고 표시하기
a-=r0
b-=r1
all4=0 #이동했으니 리셋
print(cnt)
#N, M을 공백으로 구분하여 입력받기
n,m=map(int, input().split())
#방문한 위치를 저장하기 위한 맵을 생성하여 0으로 초기화
di=[[0] * m for _ in range(n)]
#현재 캐릭터의 X 좌표, Y 좌표, 방향을 입력받기
a, b, d=map(int, input().split())
visit[a][b]=1 #현재 좌표 방문 처리
#전체 맵 정보를 입력받기
mapp=[]
for i in range(n):
mapp.append(list(map(int, input().split())))
#북, 동, 남, 서 방향 정의 (각 방향을 바라보았을 때 앞쪽 좌표로 이동하는 법)
dx=[-1,0,1,0]
dy=[0,1,0,-1]
#왼쪽으로 회전
def turn_left():
global d
d-=1
if d==-1:
d=3
#시뮬레이션 시작
cnt=1
all4=0
while True:
turn_left() #왼쪽으로 회전
nx=a+dx[d]
ny=b+dy[d]
#회전한 이후 앞에 가보지 않은 칸이 존재하는 경우 이동(가보았는지, 육지인지 체크)
if visit[nx][ny]==0 and mapp[nx][ny]==0:
visit[nx][ny]=1 #이제 가봤다고 표시
a=nx
b=ny
cnt+=1
all4=0
continue #시간 줄이기
else:
all4+=1
if all4==4:
#뒤쪽 좌표
nx=a-dx[d]
ny=a-dy[d]
if mapp[nx][ny]==0: #육지라면 뒤로 이동
a=nx
b=ny
else:
break #바다라면 종료
all4=0 #이동했으니 리셋
print(cnt)