본문 바로가기

Algorithm/Implementation

 

 

문제

뱀의 움직임

- 몸길이를 늘려 머리를 다음칸에 위치시킨다.

- 이동한 칸에 사과가 있다면 사과는 없어지고 꼬리는 움직이지 않는다.

- 사과가 없다면, 몸길이를 줄여 꼬리가 위치한 칸을 비워준다, 즉 몸 길이는 변하지 않는다.

 

초기 조건

- 초기 길이는 1이다.

- 처음에는 오른쪽을 향한다.

 

게임 끝나는 조건

- 뱀이 자신의 몸 또는 벽에 부딪히는 경우

 

해결

이 문제는 좀 뱀의 움직임을 이해를 하는데 하는데 노력해야 한다.

 

1. 뱀의 길이는 1cm이다.

2. 몸길이를 늘려 머리를 다음칸에 위치시킨다.

-> 예를 들어, 뱀이 시작지점인 (0, 0)에 위치한다고 가정했을 때, 뱀의 머리와 꼬리 모두 (0, 0)에 위치한 것이다.

-> 움직임이 들어가면 (0, 0)에 꼬리, (0, 1)에 머리가 위치한다.

-> 사과가 머리 부분에 있으면 꼬리는 그대로 있고, 머리부분에 없다면 꼬리는 머리위치로 온다.

 

그렇다면 게임 끝나는 조건을 한번 다시볼 필요가 있다.

- 자신의 몸, 벽 부딪힘.

1. 벽 부딪힘 -> 머리 pos가 맵 밖인가를 처리한다.

2. 자신의 몸 부딪힘

- 어떤 경우를 자신의 몸과 부딪히는 경우인가?

-> 몸의 길이가 2이상이고 회전할때 부딪힌다.

 

예를들어, 길이가 2인 뱀이 꼬리가 (0, 0), 머리가 (0, 1) 에 위치해 있다고 가정하자

이 때, 오른쪽으로 회전하여 (1, 0)으로 이동할 것이다.

1. 1cm길이의 뱀은 우선 머리를 늘려 머리를 (1, 0)에 위치시킬것이다.

2. 몸이 위치한 pos는 (0, 0), (0, 1), (1, 1)

3. 다음의 경우의 수는 두가지이다. (1, 1)에 사과가 있거나 없거나

    3-1 (있을 경우) : 꼬리는 움직이지 않기에 그대로 충돌되지 않는다.

    3-2 (없을 경우) : 머리는 (1, 1)에 있을 것이고 (0, 0)의 꼬리가 (0, 1)로 움직이면서 충돌한다.

 

즉, 길이가 2이상인 뱀이 회전중에 다음칸에 사과가 없다면 자신의 몸과 충돌한다.

 

 

코드

def solution(n, apples, turn):
    turn_index = 0
    dx = [0, 1, 0, -1]
    dy = [1, 0, -1, 0]
    direction = 0
    snake_pos = [[0, 0]]
    time = 0
    for i in range(30):
        time += 1
        next_x = snake_pos[-1][0] + dx[direction]
        next_y = snake_pos[-1][1] + dy[direction]

        # 사과 체크
        if [next_x, next_y] in apples:
            snake_pos.append([next_x, next_y])
        else:
            snake_pos.append([next_x, next_y])
            snake_pos.pop(0)
        
        # 방향 변경 체크
        if turn_index < len(turn):
            if time == turn[turn_index][0]:
                # 자신의 몸과 충돌
                if len(snake_pos) > 1:
                    return time
                if turn[turn_index][1] == 'D':
                    direction += 1
                else:
                    direction -= 1
                turn_index += 1
        if direction < 0:
            direction = 3
        if direction > 3:
            direction = 1

        # 벽 충돌 체크
        if snake_pos[-1][0] < 0 or snake_pos[-1][0] > n-1:
            return time
        if snake_pos[-1][1] < 0 or snake_pos[-1][1] > n-1:
            return time
        

        print("times : ", time, "pos : ", snake_pos)





n1 = 6
n2 = 10

apples = [
    [3, 4],
    [2, 5],
    [5, 3]
]

apples1 = [
    [1, 2],
    [1, 3],
    [1, 4],
    [1, 5]
]

apples2 = [
    [1, 5],
    [1, 3],
    [1, 2],
    [1, 6],
    [1, 7]
]

turn = [
    [3, 'D'],
    [15, 'L'],
    [17, 'D']
]

turn1 = [
    [8, 'D'],
    [10, 'D'],
    [11, 'D'],
    [13, 'L']
]

print(solution(n1, apples, turn))

 

 

 

 

'Algorithm > Implementation' 카테고리의 다른 글

자물쇠와 열쇠  (0) 2023.04.15
치킨 배달  (0) 2023.04.14
문자열 재정렬  (0) 2023.04.09
럭키 스트레이트  (0) 2023.04.09
게임 개발  (0) 2023.04.09