[동빈북] 구현 - 게임개발

김우경·2020년 11월 10일
0

알고리즘

목록 보기
6/69

문제설명

IN

  • 맵의 세로크기 N, 맵의 가로크기 M

  • 게임 캐릭터의 좌표와 바라보는 방향

    → 방향: 북0 동1 남2 서3

  • 맵이 육지인지 바다인지에 대한 정보

    → 0: 육지, 1: 바다

OUT

  • 이동 후 캐릭터가 방문한 칸의 수

문제

  • 캐릭터는 11크기의 정사각형으로 이루어진 NM크기의 맵에서 이동

  • 각 칸은 바다 또는 육지로 이루어져있는데 바다는 지날 수 x

  • 움직이는 조건은

    1. 현재 방향 기준 '왼쪽부터' 빈칸 둘러보기

      1.1 바로 왼쪽이 방문x?

      : 왼쪽으로 회전 후 왼쪽으로 한칸

      1.2 바로 왼쪽이 방문 o

      : 왼쪽으로 회전만 하고 이동은 x

    2. 네 방향 이미 가본칸/4면이 바다인 경우

      : 뒤로 한칸, 뒤쪽이 바다면 종료

풀이

def solution():
    N, M = map(int, input().split())
    pos = list(map(int, input().split()))
    map_info = []
    dx = [0, 1, 0, -1]
    dy = [-1, 0, 1, 0]
    dir_count = 0
    count = 1

    for i in range(N):
        arr = list(map(int, input().split()))
        map_info.append(arr)
    map_info[pos[0]][pos[1]] = 2
    
    while True:
        if dir_count > 4:
            back = (pos[2]+2) % 4
            pos[1] += dx[back]
            pos[0] += dy[back]
            if map_info[pos[0]][pos[1]] == 1:
                break
            else:
                dir_count = 0
        #바라보는 방향 기준 왼쪽을 방문했는지 ? 
        left = (pos[2]+3)%4
        if map_info[pos[0]+dy[left]][pos[1]+dx[left]] == 0:
            #왼쪽 방문한적 없음
            pos[2] = left
            pos[1] += dx[pos[2]]
            pos[0] += dy[pos[2]]
            map_info[pos[0]][pos[1]] = 2
            count += 1
            dir_count = 0
            
        else:
            pos[2] = left
            dir_count += 1
            
        print("pos: ", pos, " count: ", dir_count)
        print(map_info)

    return count   

print(solution())
  • 육지는 0, 바다는 1, 방문한 육지에 대해서는 2로 처리함

    → 처음 시작점도 방문했으므로 초기에 2로 설정해줘야함!!

  • 왼쪽으로 회전 → (현재위치 + 3)%4

  • 뒤로 이동 → (pos[2]+2) % 4

profile
Hongik CE

0개의 댓글