ⓛ 캐릭터가 있는 장소는 1 X 1 크기의 정사각형으로 이뤄진 맵 N X M 크기의 직사각형으로, 각각의 칸은 육지 또는 바다이다. (바다로 이동불가)
② 캐릭터는 동서남북 중 한 곳을 바라본다. 그리고 상하좌우로 움직일 수 있다.
③ 맵의 각 칸은 (A,B)로 나타낼 수 있음
👉 A : 북쪽으로부터 떨어진 칸의 개수 | B : 서쪽으로부터 떨어진 칸의 개수
[캐릭터의 움직임을 설정하기 위해 정해놓은 메뉴얼]
1. 현재 위치에서 현재 방향 기준으로 왼쪽방향부터 차례대로 갈 곳을 정함
2. 캐릭터의 왼쪽방향에 가보지 않은 칸이 존재 => 왼쪽 방향 회전 후, 왼쪽 한칸 전진
가봤던 칸이라면 왼쪽만 회전하고 1번으로 다시 되돌아감
3. 1,2번을 반복해보더라도 이미 다 가본 방향이라면 현 방향에서 1칸 뒤로 가고 다시 1번 반복. 만약 1칸 뒤가 바다라면 움직임을 멈춘다.(입력) ⓐ 맵 세로 크기와 가로크기를 입력 ⓑ (0: 북쪽 | 1: 동쪽 | 2: 남쪽 | 3: 서쪽 ) ⓒ 각 칸이 육지인지 바다인지 입력한다 ( 0 : 육지 | 1 : 바다) 처음 게임 캐릭터 위치한 칸은 항상 육지 (출력) 이동을 마친 후 캐릭터가 방문한 칸의 수
👇 답지를 보기 전 작성한 코드
N,M=map(int,input().split())
n,m,actor=input().split()
map=list()
for i in range(0,N):
a=list(input().split())
map.append(a)
current='1'
# 1 1 1 1
# 1 0 0 1
# 1 1 0 1
# 1 1 1 1
# 서쪽은 [j][i-1]
# 남쪽은 [j+1][i]
# 북쪽은 [j-1][i]
# 동쪽은 [j][i+1]
step=0
i=int(n)
j=int(m)
ct=0
while current!='0':
print(i,j)
if ct==3:
i=0
j-=1
if map[j][i]=='0':
break
if map[j][i]!='Done':
map[j][i]='Done'
else:
i-=1
ct+=1
이미 지나간 경로는 'Done'으로 채워놓고, 동서남북에 따라 j와 i 연산을 다르게 해놨는데..
사실 출력예시가 왜 3이 나오는지 이해를 못해서 일단 되는대로 짜긴했지만.. 맞는답을 찾지 못했다.
📌답안 예시를 본 후 피드백
ⓐ 방향을 설정해서 이동하는 문제유형에선 dx, dy 별도의 리스트를 만들어 방향을 정하는 것이 효과적이다.
ⓑ 2차원 리스트 선언 시 컴프리헨션 사용
👉 리스트 컴프리헨션이란 for문(중첩 for문 사용가능)이나 if문을 한줄로 사용하여 리스트를 채운다.
예시 코드 1) [i for i in range(3)]
예시 코드 2) [i*2 for i in range(3)]
예시 코드 3) [i for i in range(3) if i%2==0]
👇 피드백 후 코드
N,M=map(int,input().split())
d= [[0]*M for _ in range(N)]
x,y,direction=map(int,input().split())
d[x][y]=1
gmap=list()
for i in range(N):
gmap.append(list(map(int,input().split())))
dx=[-1,0,1,0] #북동남서
dy=[0,1,0,-1]
def turn_left():
global direction
direction-=1
if direction == -1: #전부 돌았을 경우
direction=3
ct=1
turn_ct=0
while True:
turn_left()
nx=x+dx[direction]
ny=y+dy[direction]
# 회전한 후 안 가본 칸에 이동한다
if d[nx][ny]==0 and gmap[nx][ny]==0:
d[nx][ny]=1
x=nx
y=ny
ct+=1
turn_ct=0
continue
else:
turn_ct+=1
if turn_ct==4:
nx=x-dx[direction]
ny=y-dy[direction]
if gmap[nx][ny]==0:
x=nx
y=ny
else:
break
turn_ct=0
print(ct)
다음에 여유있을 때 이 포스팅을 좀더 보완해와야겠다.