시뮬레이션 알고리즘 (Simuliation Algorithm)은 말 그대로 어떤 문제에서 제시된 수행 조건들을 한 단계씩 순서대로 수행하도록 구현하는 알고리즘이다. 보통 캐릭터를 2차원 공간의 게임 맵안에서 이동시키는 구현에 많이 사용된다.
아래가 시뮬레이션 알고리즘의 예제이다.
게임 개발
- N * M 직사각형의 게임판 (3<=N, M <50)
- 게임 칸의 특성 : 육지(0), 바다(1)
- 캐릭터가 있는 위치(A, B) : A는 북쪽에서 남쪽으로의 거리, B는 서쪽에서 동쪽으로의 거리이다.
- 바라보고있는 방향(d) : 북쪽(0), 동쪽(1), 남쪽(2), 서쪽(3)
캐릭터 이동 방법
- 캐릭터의 위치에서 왼쪽 방향부터 순서대로 칸으로 이동하려고 한다. (상하좌우, 육지로만 이동 가능)
- 캐릭터의 왼쪽 방향에 아직 가보지 못한 칸은 왼쪽으로 방향을 회전하고, 1칸 전진한다. 만약, 가본 칸이라면 방향만 한번 더 회전한 후, 다시 왼쪽 방향부터 탐색한다.
- 만약 모든 방향이 가본 칸이거나 바다인 칸이라면, 바라보고있는 방향 그대로 뒤로 1칸 후진한다. 만약, 후진도 불가능한 칸이라면 이동을 멈추고, 종료한다.
# 입력 예시
4 4 # N, M
1 1 0 # A, B, d
1 1 1 1 # 게임판 입력
1 0 0 1
1 1 0 1
1 1 1 1
입력된 데이터를 바탕으로 시뮬레이션 알고리즘을 구현하여 아래와 같이 캐릭터가 방문한 칸의 수를 출력해주는 문제이다.
# 출력 예시
3
나의 풀이
N, M = list(map(int, input().split(" ")))
A, B, d = list(map(int, input().split(" ")))
game_map = []
for i in range(0, N):
game_map.append(list(map(int, input().split(" "))))
count = 1
rotation = 0
da = [1, 0, -1, 0]
db = [0, 1, 0, -1]
while True:
if rotation==4:
next_a = A + da[(d+2)%4]
next_b = B + db[(d+2)%4]
if game_map[next_a][next_b] == 1:
break
A = next_a
B = next_b
rotation = 0
count+=1
continue
game_map[A][B] = 1
rotation+=1
next_d = (d+3)%4
next_a = A + da[next_d]
next_b = B + db[next_d]
if game_map[next_a][next_b] == 0:
A, B, d = next_a, next_b, next_d
rotation = 0
count += 1
continue
d = next_d
print(count)
시뮬레이션 알고리즘 문제를 쉽고, 빠르게 코드로 옮기기 위해서는 문제에 제시된 조건을 정확히 잘 이해하고, 단순화시키는 것이 가장 중요할 것 같다.
출처
나동빈, 『이것이 취업을 위한 코딩 테스트다 with 파이썬』, 한빛미디어(2021)
'Programming > python' 카테고리의 다른 글
PyCharm에서 anaconda 가상환경 구축하기 (0) | 2023.11.17 |
---|---|
pip으로 opencv version 업데이트/재설치하기 (0) | 2023.11.08 |
파이썬 any(), all() 기능은 무엇인가? (0) | 2023.07.15 |
프로그래머스 연습 문제 > 정렬 > 가장 큰 수 (0) | 2023.07.15 |
[파이썬 기초] 문자열(string) 앞뒤로 원하는 문자 붙이기 (0) | 2023.05.11 |