백준 3190 뱀 (시뮬레이션) with Python

jaehan·2022년 12월 30일
0

알고리즘

목록 보기
6/7
post-custom-banner

문제

삼성전자 SW 역량테스트
https://www.acmicpc.net/problem/3190

문제 요약

n x n 크기의 보드에서 뱀이 이동하는데 만약 뱀이 벽이나 자기 몸에 부딪히면 끝나는 게임이다.
규칙들은 사과가 주어지는데 만약 뱀이 이동했을 떄 사과가 있으면 몸이 늘어난 상태로 있게 되고 만약 사과가 없다면 꼬리가 하나 줄어 크기를 유지한다.
또한 [시간, 회전] 또한 주어지는데 뱀이 이동할 떄마다 1초가 지나고 만약 주어진 시간에 다다르게 된다면 회전(C or D)에 따라 방향을 오른쪽으로 또는 왼쪽으로 회전한다.

풀이과정

시뮬레이션 문제이기 때문에 주어진 조건들을 하나씩 구현하면 되는데

우선 n + 1크기의 0으로 초기화된 배열을 선언해서 보드를 만들어 준다. (벽을 나타내기 위해 n + 1)

다음으로 사과의 위치를 입력받아 보드에 2로 초기화 해준다.

또한 [시간, 회전] 을 입력받아 turn이라는 배열에 넣어준다.

이제 뱀을 이동시킬 건데 뱀의 첫위치를 1, 1로 지정해주고 나는 뱀의 위치를 1로 정할것이기 때문에 보드[1][1] = 1로 초기화 해준뒤 뱀을 이동시킨다. 또한 뱀의 위치정보를 저장할 배열도 선언해준다.

이동과정은 우선 방향에 맞춰 한칸 이동하고, 만약 벽이나 몸에 부딪히지 않았다면 사과가 있는지를 확인해 준다.

만약 사과가 없었다면 꼬리를 한칸 이동시킨뒤 머리는 어차피 움직였기 때문에 머리도 이동시켜 준다.

그리고 마지막에 회전할 시간이면 조건에 따라 회전시켜 준다.

탈출 문은 뱀이 벽이나 몸에 부딪혔을때 break 해준다.

코드

def turn_dir(dir, c): # 회전시키는 함수
    if c == 'L':
        return (dir + 3) % 4 
    else: 
        return (dir + 1) % 4

def print_map(map): # 맵 확인용
    for i in range(len(map)):
        print(map[i])

def solution():

    n = int(input())
    maps = [[0] * (n + 1) for _ in range(n + 1)] # n + 1크기의 배열 생성

    k = int(input())
    # 사과 2
    # 뱀위치 1
    for _ in range(k):  # 맵에 사과 위치 2로 지정
        x, y = map(int ,input().split())
        maps[x][y] = 2

    l = int(input())
    turn = [] # (시간, 회전) 리스트
    for _ in range(l):
        x, c = input().split()
        turn.append([int(x), c])

    x, y = 1, 1  # 뱀의 첫위치
    maps[x][y] = 1

    dx =[0, 1, 0, -1]  #상하좌우 방향
    dy =[1, 0, -1, 0]

    dir = 0 # 처음은 오른쪽
    time = 0 # 시간
    turn_index = 0 # 회전

    snake_index = [[x,y]] # 뱀의 위치 저장
    while True:
        x += dx[dir]  # 1칸이동
        y += dy[dir]
        if x <= n and y <= n and x >=1 and y >= 1 and maps[x][y] != 1: # 벽이나 몸에 안부딪힌 경우
            if maps[x][y] != 2: # 사과없음
                px, py = snake_index.pop(0)  # 꼬리 한칸이동
                maps[px][py] = 0
            maps[x][y] = 1
            snake_index.append([x,y]) # 어차피 머리는 움직이니까 머리는 뱀 위치에 추가
        else:
            time += 1
            break
        time += 1
        # 여기서 회전
        if turn_index < l and turn[turn_index][0] == time: 
            dir = turn_dir(dir, turn[turn_index][1])
            turn_index += 1
    return time

print(solution())
post-custom-banner

0개의 댓글