🥕 [ 이코테 교재 ] 게임 개발
교재 118p
참고한 책 ; 나동빈 (2020). <이것이 취업을 위한 코딩 테스트다 with 파이썬>. 서울시: 한빛미디어.
🍒 문제 분석
N * M의 맵이 주어진다. ( 0은 육지, 1은 바다 )
캐릭터의 위치와 방향 또한 주어진다. ( 맵의 시작은 참고로 (1,1) )
0 : 북쪽, 1 : 동쪽, 2 : 남쪽, 3 : 서쪽
1. 현재 방향을 기준으로 왼쪽 방향 부터 차례대로 갈 곳을 정한다.
2. 캐릭터의 왼쪽 방향에 가보지 않은 칸이 존재하면, 왼쪽 방향으로 회전 후 한칸 전진하다.
3. 가보지 않은 칸이 없다면, 왼쪽 방향으로 회전만 수행 한 후 1단계로 돌아간다.
4. 4 방향 모두 가본 칸이거나 바다여서 전진이 불가능하다면, 바라보고 있는 방향을 유지한 채로 한 칸 뒤로 가고, 1단계로 돌아간다. 단, 뒤에 바다가 있다면 캐릭터는 움직임을 멈춘다.
🥑 코드
N, M = map(int, input().split())
# 북 동 남 서
dx = [-1, 0, 1, 0] # 행
dy = [0, 1, 0, -1] # 열
x, y, direction = map(int,input().split())
visit = [[0]*M for _ in range(N)] # 방문 확인을 위한 map
visit[x][y] = 1 # 현재 위치 방문 처리
cnt =1 # 캐릭터가 방문한 수
# 전체 맵 정보
array = []
for i in range(N):
array.append(list(map(int,input().split())))
def turn_left():
global direction
direction -= 1 # 북<-동<-남<-서
if direction == -1:
direction = 3 # 서 <- 북
while True:
for _ in range(4): # 동서남북 4번 도니깐
turn_left()
nx = x + dx[direction]
ny = y + dx[direction]
if visit[nx][ny] == 1 or array[nx][ny] == 1:
continue
else:
x = nx
y = ny
visit[x][y] = 1
cnt += 1
break
else : # 다 돌았는데 전진 못했으면 보고있는 방향에서 뒤로 한칸
nx = x - dx[direction]
ny = y - dy[direction]
if array[nx][ny] == 1:
break
else :
x = nx
y = ny
print(cnt)
🍉 깨달은 점 및 정리
1. dx, dy 를 리스트로 만들어서, 인덱스가 방향을 의미하고, value는 전진 했을 때 몇 칸 가는지를 표현
2. vist 리스트를 만들어서 방문한 노드인지 아닌지를 확인
3. turn_left() 와 같이 별도 함수 만들어서 응용 .feat direction의 글로벌 선언
4. cnt 변수로 나중에 vist 리스트 안의 갯수 다 셀 필요 없이 그냥 바로 출력
5. nx와 ny로 (n은 new 의 약자) 만약 전진한다면, 어떻게 되는지 미리 결과를 보고 괜찮으면 x와 y 값을 대체
6. x가 행, y가 열 표현이라 평소 알던 x축 y축 생각하면 안된다는거 (반대!)
'알고리즘' 카테고리의 다른 글
[알고리즘] 다이나믹 프로그래밍 (0) | 2022.06.11 |
---|---|
[알고리즘] DFS, BFS (0) | 2022.06.07 |
[알고리즘] 구현 (0) | 2022.05.30 |
[알고리즘] 그리디 실습 (숫자 카드 게임, 1이 될 때 까지) (0) | 2022.05.22 |
[알고리즘] 그리디(Greedy) 알고리즘 (0) | 2022.05.21 |