[백준] 3190 - 뱀 (python)
2022. 1. 1. 21:56ㆍ개발/알고리즘
문제 자체는 단순 구현문제이고, 기존에 C++로도 풀었기에 생각보다 어렵지 않았다.
다음 부분을 그대로 구현하는게 핵심적인 문제라고 생각하면 된다.
뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따른다.
- 먼저 뱀은 몸길이를 늘려 머리를 다음칸에 위치시킨다.
- 만약 이동한 칸에 사과가 있다면, 그 칸에 있던 사과가 없어지고 꼬리는 움직이지 않는다.
- 만약 이동한 칸에 사과가 없다면, 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다. 즉, 몸길이는 변하지 않는다.
결국 머리 위치만 잘 이동해주면 되고 (list.insert로 제일 앞에 삽입해줌)
중간 몸은 그대로 두고, 꼬리만 사과를 먹지 못하면 삭제를 하면 되었다.
또 놓치기 쉬운 부분이 하나 있는데..
게임 시작 시간으로부터 X초가 끝난 뒤에 왼쪽(C가 'L') 또는 오른쪽(C가 'D')로 90도 방향을 회전시킨다.
해당 부분을 놓쳤었고, 이동전에 회전하도록 로직을 작성했었어서 문제를 못풀었었다.
N = int(input())
K = int(input())
dy = [0,1,0,-1]
dx = [1,0,-1,0]
apples = []
for i in range(K):
y, x = map(int,input().split())
apples.append([y,x])
L = int(input())
rotate = []
for i in range(L):
t, d = input().split()
t = int(t)
rotate.append([t,d])
snake = [[1,1]]
direction = 0
t = 0
while True:
t += 1
y, x = snake[0][0], snake[0][1]
moved_y, moved_x = y + dy[direction], x + dx[direction]
if moved_y > N or moved_y < 1 or moved_x > N or moved_x < 1:
print(t)
break
if [moved_y, moved_x] in snake:
print(t)
break
if [moved_y, moved_x] in apples:
apples.remove([moved_y,moved_x])
else:
del snake[-1]
snake.insert(0,[moved_y,moved_x])
if len(rotate) > 0:
if rotate[0][0] == t:
if rotate[0][1] == 'D':
direction = (direction + 1) % 4
else:
direction = (direction - 1) % 4
del rotate[0]
'개발 > 알고리즘' 카테고리의 다른 글
[프로그래머스] 기둥과 보설치 (Python) (0) | 2021.12.30 |
---|---|
[BOJ 1414] 사탕 (0) | 2019.03.28 |