킹의 개발일지

게임 개발(이코테 실전문제) 본문

문제풀이

게임 개발(이코테 실전문제)

k1ng 2022. 11. 30. 16:18

처음에 이 문제를 접근할 때 단순히 bfs 알고리즘을 사용해서 갈 수 있는 방향을 탐색하고, 카운트를 늘려주었다. 그렇게, 더이상 방문할 수 있는 칸이 남아있지 않다면 탐색을 종료하도록 했다.

 

하지만 그렇게 했을 때 세번째 매뉴얼, '만약 네 방향 모두 이미 가본 칸이거나 바다로 되어 있는 칸인 경우, 바라보는 방향을 유지한 채로 한 칸 뒤로 가고 1단계로 돌아간다. 이때 뒤쪽 방향이 바다인 칸이라 뒤로 갈 수 없는 경우에는 움직임을 멈춘다.'을 만족할 수 없었다.

그래서 네 방향을 모두 탐색했을 때 더이상 갈 수 있는 방향이 없다면, visited로 처리한 칸이라도 다시 방문했어야 했는데, 여기서 애를 좀 먹었다.

 

따라서 회전수를 기록하는 turn_times 변수를 선언해서 몇번 회전했는지 추적해야했다. 더이상 갈 수 있는 방향이 없고, 이때 회전수가 4번 이상이라면 이미 간 방향이라도 다시 갈 수 있도록 말이다.

 

위 내용만 숙지한다면, 일반 탐색문제와 다를 빠 없었다.

 

코드

import sys
n, m = map(int, sys.stdin.readline().split())
a, b, d = map(int, sys.stdin.readline().split())
matrix = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
visited = [[False for _ in range(m)] for _ in range(n)]

# 현재 좌표를 방문 처리
visited[a][b] = True

# 북, 동, 남, 서
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

# 왼쪽으로 회전 시켜주는 함수
def turn_left():
    global d
    d -= 1
    if d < 0:
        d = 3

cnt = 1

# 회전 횟수를 저장해주는 변수!! 회전횟수가 4개가 되면 뒤로 한 칸 이동해야한다!
turn_time = 0
while True:

    # 왼쪽 회전
    turn_left()
    nx = dx[d] + a
    ny = dy[d] + b

    if not visited[nx][ny] and matrix[nx][ny] != 1:
        visited[nx][ny] = True
        cnt += 1
        a = nx
        b = ny
        # 회전한 곳으로 갈 수 있다는 뜻은 추가적인 회전이 필요 없는것.
        turn_time = 0
        continue
    # 회전한 곳으로 갈 수 없는 경우 추가적인 회전이 필요.
    else:
        turn_time += 1
    
    # 모든 방향이 가본곳이거나, 바다라서 갈 수 없어 회전만 4번한 경우
    # 방향을 유지한 채로 뒤로가야함 때문에 turn_time += 1 한후 바로 if로 조건검사를 해야한다.
    # 뒤로 한칸가고 1단계로 돌아간다.
    if turn_time == 4:
        nx = a - dx[d]
        ny = b - dy[d]

        # 만약 뒤로 가려는데, 바다인 경우 모험을 종료한다.
        if matrix[nx][ny] == 1:
            break
        else:
            a = nx
            b = ny
        
        # 4번 다 돌았다면, 방향을 유지하고 뒤로 가야한다.
        # 이미 visited는 모두 방문 되었기 때문에,
        # 다음 while문들은 방향만 회전하고 결국 같은 방향으로 뒤로간다.
        turn_time = 0

print(cnt)

 

 

 

'문제풀이' 카테고리의 다른 글

연구소 (백준 14502번)  (0) 2022.12.04
치킨 배달 (백준 15686번)  (0) 2022.12.01
무지의 먹방 라이브(2019 KAKAO BLIND RECRUITMENT)  (0) 2022.11.30
점프(백준 1890번)  (0) 2022.11.24
최장 공통 부분 서열 문제 (LCS)  (0) 2022.11.22