알고리즘/백준 문제풀이

[삼성SW역량][Python/BOJ] 백준 3190 뱀(시뮬레이션)

개발자 덕구🐾 2022. 7. 12. 11:01
728x90

 

 

시뮬레이션 문제로 문제에서 요구하는 사항을 완성시키면 된다.

 

 

 

 

뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따른다.

  • 먼저 뱀은 몸길이를 늘려 머리를 다음칸에 위치시킨다.
  • 만약 이동한 칸에 사과가 있다면, 그 칸에 있던 사과가 없어지고 꼬리는 움직이지 않는다.
  • 만약 이동한 칸에 사과가 없다면, 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다. 즉, 몸길이는 변하지 않는다.

 

 

1. mp를 입력받는다.

2. 사과의 위치를 1으로 표시한다.

3. 방향을 바꿀 시간을 입력받는다.

4. start() 

     4-1. 덱에 위치를 넣는다.

     4-2. 벽 또는 본인 몸에 부딪히지않았다면 방문을 표시한다.

     4-3. 만약 사과가 있다면 꼬리를 제거하지않고 없다면 제거한다.

     4-4. 만약 현재 시간이 3에서 입력받은 방향을 바꿀 시간이라면 change()를 호출한다.

5. change()

    5-1. "L"이라면 왼쪽이므로 우 상 좌 하

    5-2. "D"라면 오른쪽이므로 우 하 좌 상 

    < dx,dy와 잘 생각하여 오른쪽으로 돌면 어떻게 더해야하는지 왼쪽으로 돌면 어떻게 더해야하는지 생각한다.>

 

 

 

코드 : 

 

from collections import deque

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


def change(d,c) :
    if c == "L" : # 왼쪽으로 방향 틀기 
        d = (d+1) %4 
    else : # 오른쪽으로 방향 틀기 
        d = (d-1) %4 
    return d 

def start() :
    direction = 1 # 초기방향 # 우 
    time = 0
    x,y = 0,0
    vis = deque([[x,y]])
    mp[x][y] = 2 # 뱀이 지나갔던 곳 
    while True :
    	time+=1
        x,y = x + dx[direction] , y + dy[direction]
        if 0<=x<n and 0<=y<n and mp[x][y] != 2 : # 갈 수있는 곳 
            if mp[x][y] == 0 : # 사과가 없다면 
                tmp_x,tmp_y = vis.popleft() 
                mp[tmp_x][tmp_y] = 0 # 꼬리 제거
            mp[x][y] = 2 # 간드아 
            vis.append([x,y])
            if time in times.keys() : # 방향을 바꿀 시간 
                direction = change(direction,times[time])
        else :
            return time 
                        
if __name__=="__main__" :
    n = int(input())
    k = int(input())
    mp = [[0]*(n) for i in range(n)]
    for i in range(k) : # 사과가 있는 곳 저장 
        x,y = map(int,input().split())
        mp[x-1][y-1] = 1
    L = int(input())
    times = {}
    for i in range(L) : # 방향 전환 시간 저장 
        x,c = input().split()
        times[int(x)]=c
    print(start())

 

 

 

만일  방향부분이 잘 이해가 안간다면

https://what-am-i.tistory.com/77

 

[C++]BFS_상하좌우 이동 배열(dx,dy)

BFS알고리즘 문제를 풀때 늘 사용하는 배열이 있다. int dx[] = {0,1,0,-1}; int dy[] = {1,0,-1,0}; 바로 이차원 배열의 탐색을 위해서 사용하는 dx와 dy배열이다. 이 배열을 이용해 상하좌우를 탐색하는데 지

what-am-i.tistory.com

위 포스팅을 참고 !!

 

 

while True 안에서 

x,y를 계속 갱신해가며 이용했으나 

while True :
        t+=1 
        nx,ny  = snake[-1][0] + dx[dir], snake[-1][1] + dy[dir]
        if 0<=nx<n and 0<=ny<n and mp[nx][ny] != 2 :
            if mp[nx][ny] !=1 : # 사과가 없다면 
                px,py=snake.popleft()
                mp[px][py] = 0 # 뱀이 빠져나감

 

이렇게 snake[-1][0], snake[-1][1]으로 뱀의 머리 부분을 이용하여 풀이할 수 도있다. 

 

 

 


 

 

 

 

이렇게 풀어도 된다. (220826 풀이)

복습하면서 나온 코드 :

 

 

리스트로 풀었지만 딕셔너리로 푸는게 좋을 것같다. 

그리고 dir 을 변경할 때 %4 하는거 잊지말기!!

 

from collections import deque

dx = [0,1,0,-1]
dy = [1,0,-1,0]


def changeDir(t) :
    global dir 
    for x,c in dirList :
        if x == t : 
            if c == "L" : 
                dir = (dir-1)%4 
            elif c == "D" :
                dir  = (dir+1)%4
        


def move() :
    global dir
    time = 0
    
    while True :
        time +=1 
        # 가장 최근 위치 ( 머리 )
        cx,cy = snake[-1]
        nx,ny = cx+dx[dir], cy+dy[dir]

        # 벽에 부딫이지않고 뱀이 없다면 
        if 0<=nx<n and 0<=ny<n and mp[nx][ny] != 2 :
            # 사과가 없다면
            # 꼬리를 뺀다. 
            if mp[nx][ny]==0 : 
                fx,fy = snake.popleft()
                mp[fx][fy] = 0
            mp[nx][ny] = 2 
            snake.append([nx,ny])
        else :
            return time 
        
        # 방향 전환 
        changeDir(time)
        
        
    



if __name__=="__main__" :
    n = int(input())
    k = int(input())
    mp = [[0]*n for _ in range(n)]
    
    # 사과 자리 표시 
    for _ in range(k) :
        a, b = map(int,input().split())
        mp[a-1][b-1] = 1 
    
    # 시간에 따른 방향 변화 
    dirList = []
    l = int(input())
    for _ in  range(l) :
        x,c = input().split()
        dirList.append([int(x),c])
    
    # 첫 방향은 오른쪽 
    dir= 0 
    snake = deque()
    # 첫 위치를 넣어준다. 
    snake.append([0,0])
    
    print(move())

 

 

 

 

 

 

참고 블로그 : 

 

https://jjangsungwon.tistory.com/27

 

[ 백준 3190 ] 뱀 - Python

문제 보기 이 문제는 시뮬레이션 문제이다. 삼성 기출문제는 대부분 bfs로 풀거나 지도에서 움직이는 형태가 많은 것 같다. 이 문제 또한 지도에서 움직이는 형태이다. 뱀은 매 초마다 이동을 하

jjangsungwon.tistory.com

 

 

 

 

복습 : 

20220715

✅ 20220724

20220826

✅ 20220911

✅ 20220916

반응형