728x90
https://www.acmicpc.net/problem/3190
구현을 열심히 해주면 되는 문제~~
뱀의 위치표현을 정확하게 하는 방법이 관건이라 생각한다.
사과를 먹으면 뱀의 현재까지 위치는 그대로 + 사과가 있던 위치(= 새로 이동한 칸)를 append 해준다.
칸에 사과가 없는 경우 뱀은 꼬리좌표를 pop 시키고, 새로 이동한 칸을 append해준다.
+ 그리고 rotate할 때 꿀팁
-1 %4 == 3 이다.
마이너스도 % 연산을 할 수 있다..!! 굉장히 간편하다
n = int(input())
k = int(input())
graph = [[0] * n for _ in range(n)]
d = 0 # 0 : D, 1: L
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
for _ in range(k):
r, c = map(int, input().split())
graph[r-1][c-1] = 2 # 사과
l = int(input()) # 방향 변환 횟수
turn_info = []
for _ in range(l):
t, c = input().split()
turn_info.append((int(t), c))
def rotate(c):
global d
if c == 'D': # right
d = (d + 1) % 4
else: # left
d = (d - 1) % 4
count = 0
turn_index = 0
sx, sy = 0, 0 # snake head 좌표
graph[0][0] = 1 # 뱀
snake = [] # 뱀 좌표
snake.append((0, 0))
while True:
count += 1
nx = sx + dx[d]
ny = sy + dy[d]
if 0 <= nx < n and 0 <= ny < n:
if graph[nx][ny] == 2: # 사과
snake.append((nx, ny)) # 뱀 꼬리
graph[nx][ny] = 1
sx, sy = nx, ny
elif graph[nx][ny] == 1: # 몸에 닿음
break
elif graph[nx][ny] == 0: # 사과 없음 -> 길이 그대로
tx, ty = snake.pop(0) # 뱀 꼬리 삭제
graph[tx][ty] = 0
snake.append((nx, ny)) # 새로운 위치로 이동
graph[nx][ny] = 1
sx, sy = nx, ny
else:
break
# 회전 시키기
if turn_index < l:
if count == turn_info[turn_index][0]:
rotate(turn_info[turn_index][1])
turn_index += 1
print(count)
728x90
'Algorithm (PS)' 카테고리의 다른 글
[백준] 20364번 : 부동산 다툼 (Python) -이진트리 (0) | 2022.12.29 |
---|---|
[프로그래머스] 순위 검색 Python3 (0) | 2022.12.27 |
[백준] 17070번 : 파이프 옮기기 1 (파이썬/python) 그래프탐색/dp (0) | 2022.12.26 |
[백준] 20115번: 에너지 드링크 (Python/파이썬) - Greedy (0) | 2022.12.25 |
백준 17615번: 볼 모으기 (Python/파이썬) - Greedy (0) | 2022.12.25 |