반응형
https://www.acmicpc.net/problem/3190
뱀 문제
사과 먹으면 뱀 길이 길어져가는 아나콘다같은 게임을 만들어 몇초 살아남는지 보는 문제
구현 문제 중 생각보다 복잡한 기능을 사용하지 않고 쉽게 해결 할 수 있는 문제
내가 푼 정답코드
# 값 받기
import sys
from collections import deque
N = int(sys.stdin.readline())
board = [[0]*N for _ in range(N)]
K = int(sys.stdin.readline())
for _ in range(K):
a, b = map(int, sys.stdin.readline().split())
board[a-1][b-1]= 1
L = int(sys.stdin.readline())
move = [0]*L
for j in range(L):
move[j] = list(sys.stdin.readline().split())
dy = [0,1,0,-1]
dx = [1,0,-1,0]
go, cnt = 0, 0 # 이동 방향 / 시간
y, x = 0, 0 # 현재 뱀 머리 위치
snake = deque([[0,0]]) # 뱀 전체 몸
while True : # 범위내에서 도는 동안
cnt += 1 # 시간 + 1
y, x = y + dy[go], x + dx[go] # go에 따른 이동
if y < 0 or y >= N or x <0 or x >= N or [y,x] in snake : #만약 머리가 뱀 몸 안에 있으면
break # 끝
snake.append([y,x]) #뱀의 머리를 몸에 추가
if board[y][x] == 0: # 사과를 먹지 않았다면
snake.popleft() # 이동했으므로 꼬리 끝부분 이동
if board[y][x] == 1: # #사과를 먹었으면
board[y][x] = 0 # 없애주자
for num, c in move : # 시간과 방향에 대해
if cnt == int(num) and c == 'D': # 시간이 num초 흐르고 D라면
go = (go+1)%4 # 시계방향으로 가!
elif cnt == int(num) and c == 'L': #시간이 num초 흐르고 L이라면
go = (go-1)%4 # 반시계방향으로 가!
print(cnt)
다른 문제와 달리 세세한 조건이 많지 않아서 구현하기 쉬웠던 문제
몇가지 조건만 구현하면 금방 해결 할 수 있었다.
1. 머리가 칸 밖으로 나가거나 자기 몸통이랑 마주치면 끝
2. 사과를 먹지 않았다면 머리를 따라 꼬리가 이동하는 구조 (queue의 구조)
3. 사과를 먹었다면 꼬리는 냅두고 머리만 이동한채로 사과를 없애주기
이 조건만 구현하면 된다.
느낀점
구현 문제를 연습하기 위해 선택한 문제로 사실 30분이면 충분히 해결해낼 수 있던 문제였으나, 이상하게 예제는 정상적으로 돌아가나 제출만하면 recursion error가 뜨는 기현상이 발생해서 뭐가 원인인지 찾는데만 1시간 넘게 소비를 해서 오래 걸린 문제..
재귀를 쓰지도 않았는데 자꾸 나와서 교수님께 물어보니 처음에 input =sys.stdin.readline 이라 하고 input을 받았어야하는데 반대로 sys.stdin.readline = input이라고 적어서 런타임 오류가 나버린것 (근데 예제는 왜돌아가...?)
그 외 부분은 구현하는데 큰 어려움이 없었고, 다음부턴 그냥 평소에 안하던짓 안하고 하던대로 해야겠단걸 느낀 문제였다..😥
반응형
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준 2615] 오목 (python) (0) | 2023.03.02 |
---|---|
[백준 1838] 버블 정렬 (python) (0) | 2023.03.01 |
[백준 17299] 오등큰수 (python) (0) | 2023.02.25 |
[백준 10986] 나머지 합(python) (0) | 2023.02.25 |
[백준 15686] 치킨 배달 (python) (0) | 2023.02.24 |
댓글