깡뇽

[코테] 구현 문제풀기 - 게임 개발 본문

Algorithm/Coding Test

[코테] 구현 문제풀기 - 게임 개발

깡뇽 2022. 2. 4. 18:52
반응형

Day7

구현 문제풀기 - 게임 개발 (난이도 중)

 

<문제>

N X M 크기의 직사각형 맵에서 각 칸은 육지 또는 바다로 이루어져 있다. 캐릭터는 동서남북 중에 한 방향을 바라보고 있으며, 상하좌우로 육지로 움직일 수 있다. 

1. 현재 위치에서 현재 방향을 기준으로 왼쪽 방향(반시계 방향으로 90도 회전한 방향)부터 차례로 갈 곳을 정함.

2. 캐릭터의 바로 왼쪽 방향에 아직 방문하지 않은 칸이 있으면, 왼쪽 방향으로 회전한 다음 왼쪽으로 한 칸 전진함. 왼쪽 방향에 칸이 다 방문한 칸이면, 왼쪽 방향으로 회전만 하고 1단계로 돌아감.

3. 만약 네 방향 모두 이미 가본 칸이거나 바다로 된 칸이면, 바라보는 방향을 유지한 채로 한 칸 뒤로 가고 1단계로 돌아감. 단, 이때 뒤쪽 방향이 바다인 칸이라 뒤로 갈 수 없으면 움직임 멈추기.

 

<조건>

첫째 줄 : 맵 크기. N과 M.

둘째 줄 : 캐릭터의 위치 좌표 & 방향

N줄 : 육지와 바다. 0과 1.

게임 개발 풀이

#솔루션

n, m = map(int, input().split())
x, y, d = map(int, input().split())
world = [[0]*m for _ in range(n)] # 방문한 위치 저장 맵

world[x][y] = 1 # 현재 좌표 방문했다고 표시
# 전체 맵 입력
array = []
for i in range(n):
  array.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
turn_time = 0
while True:
  # 왼쪽으로 회전
  turn_left()
  nx = x + dx[d]
  ny = y + dy[d]

  #회전한 이후 정면에 가보지 않은 칸이 있다면 이동
  if world[nx][ny] == 0 and array[nx][ny] == 0:
    world[nx][ny] = 1
    x = nx
    y = ny
    cnt += 1
    turn_time = 0
    continue
  #회전한 이후 정면에 가보지 않은 칸이 없거나 바다
  else:
    turn_time += 1
    # 네 방향 모두 갈 수 없음
    if turn_time == 4:
      nx = x - dx[d]
      ny = y - dy[d]
      # 뒤로 갈 수 있으면 이동
      if array[nx][ny] == 0:
        x = nx
        y = ny
      # 뒤가 바다
      else:
        break
      turn_time = 0

print(cnt)

아직 100% 이해하지 못했다..

반응형