[알고리즘] 구현 - 게임 개발

ungnam·2025년 3월 11일

📌 게임 개발 - 코드 비교 분석

1️⃣ 내가 작성한 코드

n, m = map(int, input().split())

a, b, d = map(int, input().split())

board = []

for _ in range(n):
  l = list(map(int, input().split()))
  board.append(l)

# 처음에 게임 캐릭터가 위치한 칸은 항상 육지
cnt = 1
board[a][b] = 1

# 방향 벡터 (북->동->남->서 : 시계 방향) / 실제 움직이는 방향: 반시계 방향
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

# 더 이상 움직일 수 없을 때까지 반복
while True:
  # 방문 여부 flag
  flag = 0
  for i in range(4):
    nx = a + dx[(d - 1 - i) % 4]
    ny = b + dy[(d - 1 - i) % 4]
    # 육지면 1로 설정하고 cnt를 증가
    if board[nx][ny] == 0:
      board[nx][ny] = 1
      a, b, d =  nx, ny, (d - 1 - i) % 4
      flag = 1
      cnt += 1
      break

  # 방문하지 않았다면 보는 방향 그대로 뒤로 한 칸 이동
  if flag == 0:

    nx = a - dx[d]
    ny = b - dy[d]
    # 뒤로 못 간다면 게임 종료 
    if board[nx][ny] == 1:
      break
    else:
      board[nx][ny] = 1
      a, b = nx, ny
      cnt += 1

print(cnt)

🔹 문제점

  • 기존 코드에서는 "뒤쪽으로 이동할 때 방문한 칸인지 여부를 따지지 않고 무조건 1로 처리"하는 문제가 있었다. 이로 인해 뒤쪽이 육지임에도 불구하고 이동할 수 없는 상황이 발생했다.

문제 요약

  • 네 방향 모두 이동할 수 없을 때 뒤쪽이 바다가 아니라면 이동 가능해야 하지만, 기존 코드에서는 무조건 1로 처리해 이동이 막힘.

수정된 코드

n, m = map(int, input().split())

a, b, d = map(int, input().split())

board = []
visited = [[0] * m for _ in range(n)]  # 방문 여부 체크 배열

for i in range(n):
    board.append(list(map(int, input().split())))

# 처음 위치 방문 처리
cnt = 1
visited[a][b] = 1  

# 방향 벡터 (북, 동, 남, 서)
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

def turn_left(d):
    return (d - 1) % 4

turn_count = 0  # 회전 횟수 체크
while True:
    d = turn_left(d)
    nx = a + dx[d]
    ny = b + dy[d]
    
    # 가보지 않은 칸이 있다면 이동
    if visited[nx][ny] == 0 and board[nx][ny] == 0:
        visited[nx][ny] = 1
        a, b = nx, ny
        cnt += 1
        turn_count = 0  # 회전 횟수 초기화
        continue
    else:
        turn_count += 1
    
    # 네 방향 모두 갈 곳이 없을 때
    if turn_count == 4:
        nx = a - dx[d]
        ny = b - dy[d]
        
        # 뒤쪽이 바다가 아니라면 이동 (방문 여부 신경 X)
        if board[nx][ny] == 0:
            a, b = nx, ny
        else:
            break  # 뒤쪽이 바다라면 종료
        
        turn_count = 0  # 다시 이동 후 초기화

print(cnt)

기존 코드와의 차이점

항목기존 코드수정된 코드
뒤로 이동 조건방문한 칸도 막힘방문한 칸이면 이동 가능
이동 방향 선택 방식(d - 1 - i) % 4로 계산turn_left(d) 함수 사용
이동 불가능 상태 체크flag 변수 활용turn_count 변수 사용

주요 개선 사항

  1. 뒤쪽이 바다가 아니면 이동 가능하도록 수정 → 방문했던 육지도 이동할 수 있도록 반영
  2. 불필요한 복잡한 연산 제거 → 방향 전환을 turn_left(d) 함수로 관리
  3. 코드 가독성 개선turn_count를 이용해 회전 횟수를 쉽게 체크

profile
꾸준함을 잃지 말자.

0개의 댓글