https://www.acmicpc.net/problem/3190
3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
n = int(input())
k = int(input()) #사과개수
arr = [[0]*(n+1) for _ in range(n+1)]
for _ in range(k):
x,y = map(int, input().split())
arr[x][y] = 1
L = int(input())
info = []
for _ in range(L):
X,C = map(str, input().split())
info.append((int(X),C))
#동 남 서 북 (오른쪽 머리)
dx = [0,1,0,-1]
dy = [1,0,-1,0]
def turn(dir, c):
if c == 'L':
dir = (dir -1)%4
else:
dir = (dir+1)%4
return dir
def simulate():
x,y = 1,1
dir = 0
arr[x][y] = 2 #뱀의 머리가 있는곳
time = 0
idx = 0 #회전정보
q = [(x,y)] #뱀의 몸통이 차지하고 있는 위치 정보(꼬리가 앞)
while True:
nx = x+ dx[dir]
ny = y + dy[dir]
# 맵안, 뱀위 몸통이 없는곳
if 1<=nx and nx <=n and 1<=ny and ny<=n and arr[nx][ny]!=2:
if arr[nx][ny] == 0:
arr[nx][ny] = 2
q.append((nx,ny))
px,py = q.pop(0)
arr[px][py] = 0
if arr[nx][ny] == 1:
arr[nx][ny] = 2
q.append((nx,ny))
else:
time +=1
break
x,y = nx,ny
time +=1
if idx < L and time == info[idx][0]:
dir = turn(dir, info[idx][1])
idx += 1
return time
print(simulate())
시뮬레이션 문제가 약해서 고민해보다 못 풀것같아서 이코테 답을 확인하고 풀었다
=> 이런 문제는 그림을 그려서 해결해야한다
내가 해결 못한 사고방향
1. 방향이 바뀌는 건 어떻게 표현하지??
처음에 머리가 우측으로 되어있고 돌아가는 것이기때문에
dx, dy 를 동쪽으로 코드를 작성한다
#동 남 서 북 (오른쪽 머리)
dx = [0,1,0,-1]
dy = [1,0,-1,0]
def turn 함수로 'L' 일 경우 왼쪽 회전
'D'일 경우 오른쪽 회전으로
%4를 해줘서 4방향 안으로 계속 돌린다
def turn(dir, c):
if c == 'L':
dir = (dir -1)%4
else:
dir = (dir+1)%4
return dir
2. 사과를 먹은 후 몸통이 늘어난 부분은 어떻게 구현하지??
코드에서는 list를 사용해서 풀었다.
q = [(x,y)]
처음 머리가 있는 부분이다. 사과를 먹고 나면 그대로 q.append[(사과먹은위치)]를 추가해준다.
사과가 없다면, 머리를 넣고 안에 있는 값을 빼준다.
'💡 Codeing Test > 백준' 카테고리의 다른 글
백준 1495) 기타리스트 (python) (0) | 2024.03.05 |
---|---|
백준 19583) 싸이버 개강 총회 (python) (1) | 2024.03.05 |
[백준_13335] 트럭 (python) (0) | 2023.10.05 |
[백준_2468번] 안전 영역 (python) (0) | 2023.08.05 |
[백준_4963번] 섬의 개수 (python) (0) | 2023.08.05 |