📌 게임 개발 - 코드 비교 분석
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 = 0
for i in range(4):
nx = a + dx[(d - 1 - i) % 4]
ny = b + dy[(d - 1 - i) % 4]
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]
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 변수 사용 |
주요 개선 사항
- 뒤쪽이 바다가 아니면 이동 가능하도록 수정 → 방문했던 육지도 이동할 수 있도록 반영
- 불필요한 복잡한 연산 제거 → 방향 전환을
turn_left(d) 함수로 관리
- 코드 가독성 개선 →
turn_count를 이용해 회전 횟수를 쉽게 체크