ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 3190 뱀
    Algorithm/백준 2023. 1. 18. 21:15

    1. 문제 📚

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

    2. 입출력 예 📋

    3. 알고리즘 ✅

    처음에 문제를 이해하는 데만 오래걸렸다;; 

    초기 시작을 (0, 0)으로 두고 1초라고 둬야한다

    보기 쉽게 $을 뱀 @ 을 사과라고 뒀다

     

    예제1을 출력해보면 

    time:  1 direction:  Right
    $ . . . . .
    . . . . @ .
    . . . @ . .
    . . . . . .
    . . @ . . .
    . . . . . .
    time:  2 direction:  Right
    . $ . . . .
    . . . . @ .
    . . . @ . .
    . . . . . .
    . . @ . . .
    . . . . . .
    time:  3 direction:  Right
    . . $ . . .
    . . . . @ .
    . . . @ . .
    . . . . . .
    . . @ . . .
    . . . . . .
    time:  4 direction:  Down
    . . . $ . .
    . . . . @ .
    . . . @ . .
    . . . . . .
    . . @ . . .
    . . . . . .
    time:  5 direction:  Down
    . . . . . .
    . . . $ @ .
    . . . @ . .
    . . . . . .
    . . @ . . .
    . . . . . .
    time:  6 direction:  Down
    . . . . . .
    . . . $ @ .
    . . . $ . .
    . . . . . .
    . . @ . . .
    . . . . . .
    time:  7 direction:  Down
    . . . . . .
    . . . . @ .
    . . . $ . .
    . . . $ . .
    . . @ . . .
    . . . . . .
    time:  8 direction:  Down
    . . . . . .
    . . . . @ .
    . . . . . .
    . . . $ . .
    . . @ $ . .
    . . . . . .
    time:  9 direction:  Down
    . . . . . .
    . . . . @ .
    . . . . . .
    . . . . . .
    . . @ $ . .
    . . . $ . .

    뱀의 머리나 몸이 벽에 닿는 순간 멈춰야한다 

     

    3가지의 조건을 따라

    1. 사과를 먹으면 뱀의 길이가 늘어나야하기 때문에 뱀의 길이를 queue라고 생각하고

    2. 사과가 없으면 다음칸으로 전진하고 꼬리를 원래의 값으로 돌려주기

    3. 그 이외의 값(뱀의 몸이 닿는 순간) 멈추기

     

    또한 방향설정이 조건에 있기 때문에 L, D 조건에 따라 방향을 바꿔줘야한다

    4. 소스코드 💻

    import sys
    from collections import deque, defaultdict
    
    input = sys.stdin.readline
    
    N = int(input().strip())
    K = int(input().strip())
    
    board = [[0 for _ in range(N)] for _ in range(N)]
    
    queue = deque([])
    queue.append([0, 0])
    
    # 사과
    for i in range(K):
        x, y = map(int, input().strip().split())
        board[x - 1][y - 1] = 2
    
    changeDir = defaultdict(str)
    L = int(input().strip())
    
    for i in range(L):
        x, c = input().strip().split()
        changeDir[int(x)] = c
    
    x, y = 0, 0
    # 뱀 초기 상태
    board[x][y] = 1
    time = 0
    direction = 0
    
    # 현재방향
    now = 'Right'
    
    def go(dir):
        global time
        global changeDir
        global now
    
        if time in changeDir:
            if dir == 'Right':
                if changeDir[time] == 'L':
                    nx, ny = x - 1, y
                    now = 'Up'
                elif changeDir[time] == 'D':
                    nx, ny = x + 1, y
                    now = 'Down'
            elif dir == 'Down':
                if changeDir[time] == 'L':
                    nx, ny = x, y + 1
                    now = 'Right'
                elif changeDir[time] == 'D':
                    nx, ny = x, y - 1
                    now = 'Left'
            elif dir == 'Left':
                if changeDir[time] == 'L':
                    nx, ny = x + 1, y
                    now = 'Down'
                elif changeDir[time] == 'D':
                    nx, ny = x - 1, y
                    now = 'Up'
            elif dir == 'Up':
                if changeDir[time] == 'L':
                    nx, ny = x, y - 1 # 수정
                    now = 'Left'
                elif changeDir[time] == 'D':
                    nx, ny = x, y + 1
                    now = 'Right'
        else:
            if dir == 'Right':
                nx, ny = x, y + 1
            elif dir == 'Down':
                nx, ny = x + 1, y
            elif dir == 'Left':
                nx, ny = x, y - 1
            elif dir == 'Up':
                nx, ny = x - 1, y
    
        return nx, ny
    
    while True:
        x, y = go(now)
        time += 1
    
        if x < 0 or x >= N or y < 0 or y >= N:
            break
    
        # 사과 존재
        if board[x][y] == 2:
            # 사과 먹음처리
            board[x][y] = 1
            queue.append([x, y])
        # 전진
        elif board[x][y] == 0:
            # 뱀 이동
            board[x][y] = 1
            queue.append([x, y])
    
            # 뱀 꼬리 가져오기
            px, py = queue.popleft()
            board[px][py] = 0
        # 뱀이 자기 몸에 닿는 순간
        else:
            break
    
    print(time)

    다른 사람들 코드보니 방향 분기를 아래와 같이 더 간편하게 짰다 ^^ ; ;

    dx = [0, 1, 0, -1]
    dy = [1, 0, -1, 0]
    
    def turn(alpha):
        global direction
        if alpha == 'L':
            direction = (direction - 1) % 4
        else:
            direction = (direction + 1) % 4
            
    while True:
        cnt += 1
        x += dx[direction]
        y += dy[direction]
        """
        이하생략
        """

    방향 조건이 조금 헷갈려서 6시간 동안 삽질했다 

     

    예를들어 나는 계속 오른쪽 방향 + L (왼쪽)  = 아래쪽이라고 생각했다 ;;

    방향이 왼쪽으로 가도록 돌리니까 아래쪽나오길래 계속 그렇게 로직을 짜서 답이 안나왔었다

    오른쪽방향 + L (왼쪽) = 위쪽 방향이다.

    L(반시계방향), D(시계방향)으로 생각해야됐었다

     

    앞으로는 조건을 더 신경써야겠다 〰️

    'Algorithm > 백준' 카테고리의 다른 글

    [Python] 1987 알파벳(dfs)  (0) 2023.01.19
    [Python] 1759 암호 만들기  (0) 2023.01.18
    [Python] 1744 수묶기  (0) 2022.12.28
    [Python] 1541 잃어버린 괄호  (0) 2022.12.27
    [Python] 2309 일곱 난쟁이  (0) 2021.10.15

    댓글

Designed by Tistory.