시뮬레이션 문제로 문제에서 요구하는 사항을 완성시키면 된다.
뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따른다.
- 먼저 뱀은 몸길이를 늘려 머리를 다음칸에 위치시킨다.
- 만약 이동한 칸에 사과가 있다면, 그 칸에 있던 사과가 없어지고 꼬리는 움직이지 않는다.
- 만약 이동한 칸에 사과가 없다면, 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다. 즉, 몸길이는 변하지 않는다.
1. mp를 입력받는다.
2. 사과의 위치를 1으로 표시한다.
3. 방향을 바꿀 시간을 입력받는다.
4. start()
4-1. 덱에 위치를 넣는다.
4-2. 벽 또는 본인 몸에 부딪히지않았다면 방문을 표시한다.
4-3. 만약 사과가 있다면 꼬리를 제거하지않고 없다면 제거한다.
4-4. 만약 현재 시간이 3에서 입력받은 방향을 바꿀 시간이라면 change()를 호출한다.
5. change()
5-1. "L"이라면 왼쪽이므로 우 상 좌 하
5-2. "D"라면 오른쪽이므로 우 하 좌 상
< dx,dy와 잘 생각하여 오른쪽으로 돌면 어떻게 더해야하는지 왼쪽으로 돌면 어떻게 더해야하는지 생각한다.>
코드 :
from collections import deque
# 하 우 상 좌
dx = [1,0,-1,0]
dy = [0,1,0,-1]
def change(d,c) :
if c == "L" : # 왼쪽으로 방향 틀기
d = (d+1) %4
else : # 오른쪽으로 방향 틀기
d = (d-1) %4
return d
def start() :
direction = 1 # 초기방향 # 우
time = 0
x,y = 0,0
vis = deque([[x,y]])
mp[x][y] = 2 # 뱀이 지나갔던 곳
while True :
time+=1
x,y = x + dx[direction] , y + dy[direction]
if 0<=x<n and 0<=y<n and mp[x][y] != 2 : # 갈 수있는 곳
if mp[x][y] == 0 : # 사과가 없다면
tmp_x,tmp_y = vis.popleft()
mp[tmp_x][tmp_y] = 0 # 꼬리 제거
mp[x][y] = 2 # 간드아
vis.append([x,y])
if time in times.keys() : # 방향을 바꿀 시간
direction = change(direction,times[time])
else :
return time
if __name__=="__main__" :
n = int(input())
k = int(input())
mp = [[0]*(n) for i in range(n)]
for i in range(k) : # 사과가 있는 곳 저장
x,y = map(int,input().split())
mp[x-1][y-1] = 1
L = int(input())
times = {}
for i in range(L) : # 방향 전환 시간 저장
x,c = input().split()
times[int(x)]=c
print(start())
만일 방향부분이 잘 이해가 안간다면
https://what-am-i.tistory.com/77
[C++]BFS_상하좌우 이동 배열(dx,dy)
BFS알고리즘 문제를 풀때 늘 사용하는 배열이 있다. int dx[] = {0,1,0,-1}; int dy[] = {1,0,-1,0}; 바로 이차원 배열의 탐색을 위해서 사용하는 dx와 dy배열이다. 이 배열을 이용해 상하좌우를 탐색하는데 지
what-am-i.tistory.com
위 포스팅을 참고 !!
while True 안에서
x,y를 계속 갱신해가며 이용했으나
while True :
t+=1
nx,ny = snake[-1][0] + dx[dir], snake[-1][1] + dy[dir]
if 0<=nx<n and 0<=ny<n and mp[nx][ny] != 2 :
if mp[nx][ny] !=1 : # 사과가 없다면
px,py=snake.popleft()
mp[px][py] = 0 # 뱀이 빠져나감
이렇게 snake[-1][0], snake[-1][1]으로 뱀의 머리 부분을 이용하여 풀이할 수 도있다.
이렇게 풀어도 된다. (220826 풀이)
복습하면서 나온 코드 :
리스트로 풀었지만 딕셔너리로 푸는게 좋을 것같다.
그리고 dir 을 변경할 때 %4 하는거 잊지말기!!
from collections import deque
dx = [0,1,0,-1]
dy = [1,0,-1,0]
def changeDir(t) :
global dir
for x,c in dirList :
if x == t :
if c == "L" :
dir = (dir-1)%4
elif c == "D" :
dir = (dir+1)%4
def move() :
global dir
time = 0
while True :
time +=1
# 가장 최근 위치 ( 머리 )
cx,cy = snake[-1]
nx,ny = cx+dx[dir], cy+dy[dir]
# 벽에 부딫이지않고 뱀이 없다면
if 0<=nx<n and 0<=ny<n and mp[nx][ny] != 2 :
# 사과가 없다면
# 꼬리를 뺀다.
if mp[nx][ny]==0 :
fx,fy = snake.popleft()
mp[fx][fy] = 0
mp[nx][ny] = 2
snake.append([nx,ny])
else :
return time
# 방향 전환
changeDir(time)
if __name__=="__main__" :
n = int(input())
k = int(input())
mp = [[0]*n for _ in range(n)]
# 사과 자리 표시
for _ in range(k) :
a, b = map(int,input().split())
mp[a-1][b-1] = 1
# 시간에 따른 방향 변화
dirList = []
l = int(input())
for _ in range(l) :
x,c = input().split()
dirList.append([int(x),c])
# 첫 방향은 오른쪽
dir= 0
snake = deque()
# 첫 위치를 넣어준다.
snake.append([0,0])
print(move())
참고 블로그 :
https://jjangsungwon.tistory.com/27
[ 백준 3190 ] 뱀 - Python
문제 보기 이 문제는 시뮬레이션 문제이다. 삼성 기출문제는 대부분 bfs로 풀거나 지도에서 움직이는 형태가 많은 것 같다. 이 문제 또한 지도에서 움직이는 형태이다. 뱀은 매 초마다 이동을 하
jjangsungwon.tistory.com
복습 :
✅ 20220715
✅ 20220724
✅ 20220826
✅ 20220911
✅ 20220916
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
[삼성SW역량][Python/BOJ] 백준 15685 드래곤커브(시뮬레이션) (0) | 2022.07.13 |
---|---|
[삼성SW역량][Python/BOJ] 백준 14499 주사위굴리기(시뮬레이션) (0) | 2022.07.13 |
[삼성SW역량][Python/BOJ] 백준 15686 치킨 배달(DFS) (0) | 2022.07.11 |
[삼성SW역량][Python/BOJ] 백준 14891 톱니바퀴(시뮬레이션) (0) | 2022.07.11 |
[삼성SW역량][Python/BOJ] 백준 14889 스타트와 링크(DFS, 백트레킹) (0) | 2022.06.30 |