Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
관리 메뉴

0과 1 사이

[파이썬(python)] 구현 문제 뱀 시뮬레이션 본문

코딩테스트

[파이썬(python)] 구현 문제 뱀 시뮬레이션

고후 2022. 1. 21. 17:48

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

 

3190번: 뱀

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

아주 어려운 문제였다.. ㅠㅠ

일단 이해하지 못한 포인트가 있었다. 자기자신의 몸과 부딪히면 게임이 끝난다는데, 무슨 말이지..?

그리고 뱀의 길이가 늘어나는 것을 어떻게 처리해야하나 고민스러웠다.

아직 이해하지 못했으나 일단 내가 작성한 코드만 올려본다.

 

내가 짠 코드

def new_direction(original_direct, change_direct, i, j):

    #원래 방향과 회전 방향에 따라 새로운 인덱스를 출력해주는 함수
    #D는 오른쪽, L은 왼쪽, U는 위쪽, E는 아래쪽
    if original_direct == 'D':
        if change_direct == 'None':
            return i, j+1, 'D'
        elif change_direct == 'L':
            return i-1, j, 'U'
        elif change_direct == 'D':
            return i+1, j, 'E'
                
    elif original_direct =='U':
        if change_direct == 'None':
            return i-1, j, 'U'
        elif change_direct == 'L':
            return i, j-1, 'L'
        elif change_direct == 'D':
            return i, j+1, 'D'
            
    elif original_direct == 'E':
        if change_direct == 'None':
            return i+1, j, 'E'
        elif change_direct == 'L':
            return i, j+1, 'D'
        elif change_direct =='D':
            return i, j-1, 'L'
                
    elif original_direct == 'L':
        if change_direct == 'None':
            return i, j-1, 'L'
        elif change_direct == 'L':
            return i+1, j, 'E'
        elif change_direct == 'D':
            return i-1, j, 'U'
                


N = int(input()) #보드의 크기
K = int(input()) #사과의 개수
apple = [[0 for _ in range(N)] for _ in range(N)]
count = 0 #초 세기
length = 1 #뱀 길이
direction = []

for _ in range(K):
    i, j = map(int, input().split())
    apple[i-1][j-1] = 1 #사과 있는 곳만 1로 표시
    
L = int(input())

for _ in range(L):
    x, c = input().split()
    x = int(x)
    direction.append([x,c])

i= 0
j= 0
keepgoing = True
original_direct = 'D'
change_direct = 'None'
while keepgoing:
    #방향 정해줌
    #i, j 값 알려줌
    for list in direction:
        if count in list:
            change_direct = list[1]

    i, j, original_direct = new_direction(original_direct, change_direct, i, j)
        

    if i >= N or j >= N or i < 0 or j < 0:
        keepgoing = False
    elif apple[i][j] == 1:
        length += 1
        apple[i][j] = 0
    count += 1
        

print(count)

 

답안을 보고 작성한 전체 코드이다

 

n = int(input())
k = int(input())
data = [[0] * (n+1) for _ in range(n+1)]

#1행 1열부터 시작이라 0행 0열은 없는것과 같은데 이럴때 인덱스가 은근히 헷갈린다.. 그런데 n+1 * n+1 크기의 배열을 정해두면 인덱스에서 -1 해줄 필요가 없다
info = []

for _ in range(k):
    a, b = map(int, input().split())
    data[a][b] = 1
    
l = int(input())
for _ in range(l):
    x, c = input().split()
    info.append((int(x), c))

dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
#문제의 핵심 포인트인것 같다. 방향이 동서남북이면 앞으로 이렇게 풀어야겠다

#회전 시키는 함수도 아주 간단하다 ㅜ
def turn(direction, c):
    if c == 'L':
        direction = (direction - 1) % 4
    else:
        direction = (direction + 1) % 4
    return direction

def simulate():
    x, y = 1, 1
    data[x][y] = 2 #뱀 있는 곳을 2로 표시할 생각은 안들었음..
    direction = 0
    time = 0
    index = 0
    
    q = [(1,1)] #큐를 구현해서 뱀이 위치한 곳을 저장해둔다
    while True:
        nx = x + dx[direction]
        ny = y + dy[direction]        
        if 1 <= nx and nx <= n and 1 <= ny and ny <= n and data[nx][ny]!= 2: #가려는 곳에 뱀이 이미 있으면 안됨
            if data[nx][ny] == 0:
                data[nx][ny]=2 #뱀이 있는 곳은 2로 표시
                q.append((nx,ny))
                px, py = q.pop(0)
                data[px][py] = 0 #꼬리 제거
            if data[nx][ny] == 1:
                data[nx][ny] = 2
                q.append((nx, ny))
        else:
            time += 1
            break
        x, y = nx, ny
        time += 1
        if index < l and time == info[index][0]: #index 변수를 설정할 생각은 안했다..

            direction = turn(direction, info[index][1])
            index += 1
    
    return time

print(simulate())
Comments