📖  문제

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이라면 꼬리가 줄어들지 않는다.

 

늘 강조하지만 구현 문제는 요구사항을 정확히 구현하고 모든 케이스에 대해서 만족하도록 고려하여 세심하게 예외 처리를 해야한다.

이러한 부분에 대해 더 노력하여 풀이 시간을 단축하자.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기