본문 바로가기

알고리즘

[백준] 3190번: 뱀

 

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

 

3190번: 뱀

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

www.acmicpc.net

 

이번 문제는 간단한 로직 구현 정도였습니다.

로직이 다른 문제에 비해서는 조금은 난이도 있었다고 생각합니다.

삼성 A형 문제들이 기본 알고리즘도 중요하지만 구현에 초점을 두고 있다는 생각이 듭니다.

(3시간 2문제여서 그런가 싶네요)

 

 

from collections import deque

n = int(input())

arr = [[0 for i in range(n)]for j in range(n)]

app = int(input())
for i in range(app):
    x, y = map(int,input().split())
    x -= 1
    y -= 1
    arr[x][y] = 1

move = int(input())
moving = []
for i in range(move):
    moving.append(input().split()) #이것도 큐로 하면 더 빨라짐

cnt = 0
dx, dy = [0,-1,0,1], [1,0,-1,0] # 오른쪽 위쪽 왼쪽 아랫쪽
nx, ny = 0, 0 #회전 현상태
x, y = 0, 0 #현재 좌표

q = deque()
arr[x][y] = -1
q.append([x,y])
while True:

    # 회전 처리
    if moving and int(moving[0][0]) == cnt:
        if moving[0][1] == "L":
            nx += 1
            ny += 1
            if nx == 4:
                nx, ny = 0, 0

        elif moving[0][1] == "D":
            nx -= 1
            ny -= 1
            if nx == -1:
                nx, ny = 3, 3

        moving.pop(0)


	# 맵을 벗어나는지 먼저 확인
    if 0 <= x+dx[nx] <= n-1 and 0 <= y+dy[ny] <= n-1:
    	
        if arr[x + dx[nx]][y + dy[ny]] == 1: # 사과
            x += dx[nx]
            y += dy[ny]
            arr[x][y] = -1
            q.append([x,y])
            
        elif arr[x+dx[nx]][y+dy[ny]] == 0: #빈 공간이면 꼬리를 지움
            x += dx[nx]
            y += dy[ny]
            arr[x][y] = -1
            q.append([x,y])
            px, py = q.popleft()
            arr[px][py] = 0
        else:
            cnt += 1
            break
    else:
        cnt += 1
        break

    cnt += 1

print(cnt)

'알고리즘' 카테고리의 다른 글

[Python] 다양한 문자열 입력 방법  (0) 2022.05.03
[백준] 14499번: 주사위 굴리기  (0) 2022.04.30
[백준] 13460: 구슬 탈출 2  (0) 2022.04.29
[백준] 5014번: 스타트링크  (0) 2022.03.22
[백준] 1697번: 숨바꼭질  (0) 2022.03.22