이것이 코딩테스트다 with 파이썬 | 구현 ③

krystal·2022년 1월 23일
0

알고리즘 공부

목록 보기
5/6
post-thumbnail

실전문제

2) 게임 개발 🎮

ⓛ 캐릭터가 있는 장소는 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)    

다음에 여유있을 때 이 포스팅을 좀더 보완해와야겠다.

profile
https://source-coding.tistory.com/

0개의 댓글

관련 채용 정보