[파이썬 알고리즘] 게임 개발 문제 풀이
업데이트:
❓ 문제
✏ 나의 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 값 입력 받기
n, m = map(int, input().split())
a, b, d = map(int, input().split())
p = [[int(x) for x in input().split()] for _ in range(n)]
# 방향 처리 (x, y)
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
p[a][b] = 1
moves = 1
turns = 0
while True:
# 반시계 방향 회전
d = 3 if not d else d - 1
turns += 1
# 임시 좌표
x, y = a + dx[d], b + dy[d]
if not p[x][y]:
turns = 0
moves += 1
a, b = x, y
p[a][b] = 1
elif turns == 4:
x, y = a - dx[d], b - dy[d]
if not p[x][y]:
a, b = x, y
else:
break
else:
continue
print(moves) # 답
캐릭터가 이동한 횟수에 뒤로 돌아가는 것도 포함인지를 몰라서 포함이 안되게 풀이를 작성하였다.
💡 문제 해결 아이디어
방향을 설정해서 이동하는 문제 유형에서는 dx, dy라는 별도의 리스트를 만들어 방향을 정하는 것이 효과적이다.
리스트 컴프리헨션 문법을 사용하면 2차원 리스트를 초기화 할 때 효율적이다.
✔️ 파이썬 답안 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# N, M을 공백을 기준으로 구분하여 입력받기
n, m = map(int, input().split())
# 방문한 위치를 저장하기 위한 맵을 생성하여 0으로 초기화
d = [[0] * m for _ in range(n)]
# 현재 캐릭터의 X 좌표, Y 좌표, 방향을 입력받기
x, y, direction = map(int, input().split())
d[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():
# direction이 함수 바깥에서 선언된 전역변수이기 때문에 global 키워드 사용
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 array[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 array[nx][ny] == 0:
x = nx
y = ny
# 뒤가 바다로 막혀있는 경우
else:
break
turn_time = 0
# 정답 출력
print(count)
💬 풀이 평가
나의 경우 if-elif-else
로 풀었지만 답안에서는 따로 확인을 했다는 점이 달랐다.
따로 확인을 해주는 이유라도 있는걸까?
Notice: 이 게시물은 한빛미디어의 이것이 코딩 테스트다 교재를 참고하였습니다.
댓글남기기