티스토리 뷰

🧩 알고리즘

[백준] 3190 뱀 - Python

yeonDev 2022. 3. 3. 16:27
 

3190번: 뱀

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

www.acmicpc.net

POINT

뱀의 위치를 에 저장하자

  • 뱀의 머리가 매번 움직이고, 꼬리는 사과를 먹으면 움직이지 않는다. → 움직일 때마다 머리 위치를 새로 저장한다.
  • 사과를 먹지 못하면 꼬리도 움직여야 한다. → 움직이기 전의 꼬리 위치를 제거한다.

뱀의 방향 전환

  • 방향에 따라 증가하는 좌표 값을 시계 방향으로 리스트에 설정해두고
  • 오른쪽으로 회전할 땐 인덱스를 증가, 왼쪽으로 회전할 땐 인덱스를 감소시킨다.
  • 동, 서, 남, 북 4가지 방향이므로, 4로 나눈 나머지를 구한다.

풀이

n = int(input()) # 보드 크기
graph = [[0] * (n+1) for _ in range(n+1)] # 보드 생성
k = int(input()) # 사과 개수

# 보드에 사과 위치 표시
for _ in range(k):
    r, c = map(int, input().split())
    graph[r][c] = 1
    
graph[1][1] = 2 # 뱀 시작 위치 표시

L = int(input()) # 뱀 방향 변환 횟수
data = [] # 방향 전환 정보

# 방향 변환 정보 저장
for _ in range(L):
    x, c = input().split()
    data.append((int(x), c))

# 우, 하, 좌, 상 (시계방향)
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
direction = 0 # 현재 방향
index = 0 # 다음 회전 정보
time = 0 # 지난 시간
x = y = 1 # 뱀 머리 위치
snake = [(x, y)] # 뱀 위치를 담은 리스트 (꼬리 -- 머리)

while True:
    # 다음 위치
    x += dx[direction]
    y += dy[direction]
    time += 1 # 시간 증가
    
    # 벽이나 몸에 부딪히면
    if (x < 1 or x > n or y < 1 or y > n) or graph[x][y] == 2:
        print(time)
        break
    
    # 사과를 먹지 못하면 꼬리 이동
    if graph[x][y] != 1:
        r, c = snake.pop(0)
        graph[r][c] = 0
        
    graph[x][y] = 2 # 머리 위치 표시
    snake.append((x, y)) # 뱀 머리 위치 저장
    
    # 방향 설정
    if index < L and time == data[index][0]:
        # 오른쪽으로 회전
        if data[index][1] == "D":
            direction = (direction + 1) % 4
        # 왼쪽으로 회전
        elif data[index][1] == "L":
            direction = (direction - 1) % 4
        index += 1

[참고자료]

 

get — Python Reference (The Right Way) 0.1 documentation

Docs » get Edit on GitHub get Description Returns the value for key in the dictionary; if not found returns a default value. Syntax dict. get(key[, default]) key Required. A key in the dictionary. default Optional. Value that is returned when the key is n

python-reference.readthedocs.io

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함