📖 문제
https://www.acmicpc.net/problem/3190
3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
💻 코드
import sys
from collections import deque
def solution():
N = int(sys.stdin.readline().strip())
b = [[-1 for _ in range(N)] for _ in range(N)]
K = int(sys.stdin.readline().strip())
for _ in range(K):
y, x = map(int, sys.stdin.readline().strip().split())
b[y - 1][x - 1] = -2
L = int(sys.stdin.readline().strip())
q = deque()
for _ in range(L):
q.append(tuple(map(str, sys.stdin.readline().strip().split())))
# 4가지 방향(상,하,좌,우) 정보
dy, dx = (0, 0, 1, -1), (1, -1, 0, 0)
# 방향 전환 정보
LT, RT = {0: 3, 1: 2, 2: 0, 3: 1}, {0: 2, 1: 3, 2: 1, 3: 0}
# t: 시간, hy/hx: 헤드 위치, ty/tx: 테일 위치, d: 방향
t = hy = hx = ty = tx = d = b[0][0] = 0
while True:
# 시간 경과
t += 1
# 헤드 움직이기
hy, hx = hy + dy[d], hx + dx[d]
# 게임 종료 조건
if hy < 0 or N <= hy or hx < 0 or N <= hx or b[hy][hx] >= 0:
print(t)
exit(0)
# 사과 존재 유무 체크
if b[hy][hx] == -1:
apple = False
else:
apple = True
# 뱀의 헤드 기록
b[hy][hx] = t
# 사과가 없었을 경우 꼬리 줄이기
if not apple:
for i in range(4):
ny, nx = ty + dy[i], tx + dx[i]
if 0 <= ny < N and 0 <= nx < N and b[ny][nx] == b[ty][tx] + 1:
b[ty][tx] = -1
ty, tx = ny, nx
break
# 방향 전환 해야할 경우
if q and int(q[0][0]) == t:
dT = q.popleft()
if dT[1] == 'L':
d = LT[d]
else:
d = RT[d]
solution()
🙌 한마디
풀이에 1시간이 소요되었는데 약 20분은 코드를 작성 후 디버깅을 하는데 소요되었다. 개선한 부분은 아래와 같다.
1. 사과 위치 정보는 1행 1열(0행 0열이 아닌)부터 시작하므로 -1을 해주어야했다.
2. 게임 종료 조건은 두 가지인데 한가지에 대해서만 작성했었다.
3. 꼬리를 줄이기 위해 4가지 방향을 체크할 때 IndexError를 피하려면 해당 위치에 보드가 존재하지 않는 경우를 고려해야했다.
4. 꼬리를 줄인 후 break를 걸어 꼬리를 두 번 줄이는 케이스가 없도록 고려해야했다.
5. 사과의 존재 유무 체크 후 꼬리를 줄이기 전 바로 헤드의 위치를 보드에 기록해야했다. 그러지 않을 경우 만약 뱀의 길이가 1이라면 꼬리가 줄어들지 않는다.
늘 강조하지만 구현 문제는 요구사항을 정확히 구현하고 모든 케이스에 대해서 만족하도록 고려하여 세심하게 예외 처리를 해야한다.
이러한 부분에 대해 더 노력하여 풀이 시간을 단축하자.
'Problem Solving > 📗BOJ' 카테고리의 다른 글
[Programmers] N으로 표현 (Python) (0) | 2021.10.21 |
---|---|
[BOJ] 14501번: 퇴사 (Python) (0) | 2021.10.21 |
[BOJ] 14502번: 연구소 (Python) (0) | 2021.10.17 |
[BOJ] 13460번: 구슬 탈출 2 (Python) (0) | 2021.10.16 |
[BOJ] 14503번: 로봇 청소기 (Python) (0) | 2021.10.02 |