Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

숭이

[시뮬레이션] 백준 3190번. 뱀 (파이썬) | 삼성 SW 역량 테스트 기출 문제 본문

코딩 테스트

[시뮬레이션] 백준 3190번. 뱀 (파이썬) | 삼성 SW 역량 테스트 기출 문제

soonge2 2024. 10. 8. 15:08

 

# Question

https://www.acmicpc.net/problem/3190

 

slither.io 게임

룰이 완전히 똑같진 않지만, 이 게임이랑 비슷한 느낌!

 

# Solution

## code

# 백준 3190번 뱀
import sys
input = sys.stdin.readline


def rotate_func(rot_way, node_way):
    if rot_way == 'D':  # 시계 회전
        if node_way == 4:
            node_way = 1
        else:
            node_way += 1
    else:  # 반시계 회전
        if node_way == 1:
            node_way = 4
        else:
            node_way -= 1
    return node_way


N = int(input())
board = [[0 for i in range(0, N)] for i in range(0, N)]
board[0][0] = 1

K = int(input())
for i in range(0, K):
    x, y = map(int, input().split())
    board[x-1][y-1] = -1  # 빈칸:0, 사과:-1, 뱀칸(몸통방향)-우:1, 하:2, 좌:3, 상:4

L = int(input())
rotate = []
for i in range(0, L):
    rotate.append(list(input().split()))

iter = 1  # 초
head_x, head_y = 0, 0  # 머리 좌표
tail_x, tail_y = 0, 0  # 꼬리 좌표
dx = [1, 0, -1, 0]  # 우, 하, 좌, 상
dy = [0, 1, 0, -1]
rot_time = int(rotate[0][0])  # 다음 방향 변환 시간

# for i in range(0, N):
#     print(board[i])
# print(" ")
while True:  # 반복문 한 번 당 1초
    # print(f"{iter}초 후:")
    # 다음 머리좌표
    head_way = board[head_y][head_x]
    head_x += dx[head_way-1]
    head_y += dy[head_way-1]

    # 벽이나 몸에 부딪히지 않는지 확인 (종료조건)
    if head_x >= N or head_y >= N or head_x < 0 or head_y < 0:  # 벽과 부딪힘
        break
    if board[head_y][head_x] != 0 and board[head_y][head_x] != -1:  # 몸과 부딪힘
        break

    # 사과 확인
    if board[head_y][head_x] != -1:  # 사과가 없다
        # 꼬리 이동
        tail_way = board[tail_y][tail_x]
        board[tail_y][tail_x] = 0
        tail_x += dx[tail_way-1]
        tail_y += dy[tail_way-1]
    board[head_y][head_x] = head_way  # 머리 이동

    # 회전
    if iter == rot_time:
        board[head_y][head_x] = rotate_func(rotate[0][1], head_way)  # 회전

        rotate = rotate[1:]
        if len(rotate) == 0:
            rot_time = -1
        else:
            rot_time = int(rotate[0][0])

    iter += 1
    # for i in range(0, N):
    #     print(board[i])
    # print(" ")

print(iter)

 

## explanation

반복문을 이용해 1초(게임 속 1초)마다 동작을 수행한다. 

Flow: 

1. 다음 머리좌표 확인

2. 이동했을 때 벽이나 몸에 부딪히지 않는지 확인 (반복문 종료조건)

3. 사과가 있는지 확인하고, 머리와 꼬리 이동

4. 회전해야 하면 회전

 

포인트

- 2차원 배열 board: 게임판 위에 뱀과 사과의 위치를 표현한다. ★

- 뱀 몸통이 향하는 각 방향을 적어둔다. (1: 동, 2: 남, 3: 서, 4: 북) ★ ★ 

 ㄴ 뱀이 꼬불꼬불할 수도 있기 때문에 이 부분을 어떻게 구현할지 고민했었고(꼬리를 이동할 때 어느 방향으로 이동할 지), 각 몸통의 방향을 적어둠으로써 해결할 수 있었다. 

 

아래에서 각 과정을 보면 더 이해하기 쉽다! 

예제 입출력 2의 수행 과정이다.