알고리즘/9oormthon Challenge

[구름톤 챌린지 #10] GameJam

young_and_mini 2023. 8. 25. 21:41

문제10. GameJam

 

구름LEVEL

난이도별 다양한 문제를 해결함으로써 SW 역량을 향상시킬 수 있습니다.

level.goorm.io



문제해결방법

보드게임의 규칙을 그대로 코드로 구현해야 하다보니 규칙을 정확하게 이해해야하는 것이 중요한 문제이다. 규칙이 은근 복잡해서 문제를 이해하는 데에는 시간이 조금 걸렸지만 구현 자체는 어렵지 않다.

 

방향과 이동할 칸 수에 대한 정보를 담고 있는 이차원 리스트와 함께, 각 플레이어들의 이동한 자취를 표시하기 위한 이차원 리스트를 같이 사용해야한다. 플레이어(또는 구름이)의 현재 위치에 따라 이동할 방향과 칸 수를 해석하고, 그만큼 이동하면서 자취를 남긴다(방문한 칸은 1로 바꿔서 표시). 계속 반복하다가 이미 방문했던 칸으로 이동하게 되었다면, 지금까지 이동한 거리를 반환한다. 플레이어와 구름이 각각 이동한 거리를 비교해서 더 큰 값을 출력해주면 된다.

 

위 내용을 코드로 구현하면 아래와 같다.

import sys

n = int(sys.stdin.readline())

#index를 활용할 수 있도록 1~n -> 0~n-1 변환
gx, gy = map(int, sys.stdin.readline().split())
gx -= 1
gy -= 1
px, py = map(int, sys.stdin.readline().split())
px -= 1
py -= 1

#명령이 써있는 보드
board_arr = [sys.stdin.readline().split() for i in range(n)]
#보드의 UDRL을 숫자로 변환하기 위함
direction_mapper = {"U" :0, "D" :1, "R" :2, "L" :3}

def go_straight(x, y):
    global n, board_arr, direction_mapper

	#방문한 곳이면 종료하기 위함
    visit_arr = [[0 for i in range(n)] for j in range(n)]
    visit_arr[x][y] = 1
    score = 1

    #이동 방향
    dx_arr = [-1, 1, 0, 0]
    dy_arr = [0, 0, 1, -1]

    while True:
        # 새로운 커맨드 해석 - 이동거리/이동방향 설정
        command = board_arr[x][y]
        count = int(command[:-1])
        direction = direction_mapper.get(command[-1])
        dx = dx_arr[direction]
        dy = dy_arr[direction]

        #이동하다가 이미 방문한곳이라면 현재 점수 반환하고 종료
        for i in range(count):
            x = (x + dx) % n
            y = (y + dy) % n
            if visit_arr[x][y] == 1:
                return score
            visit_arr[x][y] = 1
            score+=1

goorm_score = go_straight(gx, gy)
player_score = go_straight(px, py)

if goorm_score > player_score:
    print("goorm",goorm_score)
else:
    print("player",player_score)