구현 - 예제) 게임 개발

Yona·2021년 9월 13일
0

🌻 algorithm

목록 보기
5/18

문제 이해

결론) 캐릭터가 방문한 칸의 수 출력

  • 움직임 메뉴얼
    1) 현재 위치에서 현재 방향 기준으로 왼쪽방향부터 차례대로 갈 곳 정함
    2) 캐릭터의 바로 왼쪽에 가보지 않은 칸이 존재하면, 왼쪽 방향으로 회전한 다음 왼쪽으로 한 칸을 전진. 왼쪽 방향에 가보지 않은 칸이 없다면, 왼쪽 방향으로 회전만 수행하고 1단계로 돌아감.
    3) 만약 네 방향 모두 가본 칸이거나 바다로 되어있는 칸인 경우에는, 바라보는 방향을 유지한 채로 한 칸 뒤로 가고 1단계로 돌아간다. 단, 이때 뒤쪽 방햐이 바다인 칸이라 뒤로 갈 수 없는 경우에는 움직임을 멈춘다.

처음 든 생각

오 복잡한데
맵 하나 더 만들어서 방문여부 체크해야겠다

교재 코드

n, m = map(int, input().split())
x, y, direction = map(int, input().split())
arr = []
for _ in range (n) :
  arr.append(list(map(int, input().split())))

# 방문한 위치를 저장하기 위한 맵을 생성하여 0 으로 초기화 
d = [[0]*m for _ in range(n)]
d[x][y] = 1

dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

# 왼쪽으로 회전
def turn_left() :
  global direction
  direction -= 1
  if direction == -1 :
    direction = 3

# 시뮬레이션 시작
count = 1
turn_time = 0
while True :
  # 왼쪽으로 회전
  turn_left()
  nx = x + dx[direction]
  ny = y + dy[direction]
  # 회전한 이후 정면에 가보지 않은 칸이 존재하는 경우 이동
  if d[nx][ny] == 0 and arr[nx][ny] == 0 :
    d[nx][ny] = 1
    x = nx
    y = ny
    count += 1
    turn_time = 0
    continue
  # 회전한 이후 정면에 가보지 않은 칸이 없거나 바다인 경우
  else :
    turn_time += 1
  # 네 방향 모두 갈 수 없는 경우
  if turn_time == 4:
    nx = x - dx[direction]
    ny = y - dy[direction]
    # 뒤로 갈 수 있다면 이동하기
    if arr[nx][ny] == 0:
      x = nx
      y = ny
    # 뒤가 바다로 막혀 있는 경우
    else : 
      break
    turn_time = 0
  
print(count)

안보고 짠 코드

나중에 기억 흐려질때쯤 다시 풀자!

profile
Sometimes you win, sometimes you learn 🏃‍♀️

0개의 댓글