yha97 2023. 6. 12. 10:53

날짜 : 2023. 06. 12

사용 언어 : python

 

문제

https://www.acmicpc.net/problem/3190

 

 

코드

import sys
from collections import deque

snake = deque()
dx = [0, 1, 0, -1]  # 동, 남, 서, 북
dy = [1, 0, -1, 0]
n = int(sys.stdin.readline())
graph = [[0] * n for _ in range(n)]
k = int(sys.stdin.readline())  # 사과 개수
for _ in range(k):
    r, c = map(int, sys.stdin.readline().split())
    graph[r-1][c-1] = 1  # 사과
l = int(sys.stdin.readline())  # 방향전환횟수
change = dict()
for _ in range(l):
    a, b = ''.join(sys.stdin.readline().rstrip()).split()
    change[int(a)] = b  # 시기, 방향 입력

cnt = 0
dir = 0
snake.append([0, 0])
while True:
    cnt += 1
    head_x, head_y = snake[0][0] + dx[dir], snake[0][1] + dy[dir]  # 몸 길이를 늘림(머리)
    if head_x in range(n) and head_y in range(n):  # 벽과 충돌 여부 파악
        if [head_x, head_y] in snake:  # 본인 몸과 충돌
            print(cnt)
            break
        snake.appendleft([head_x, head_y])  # 머리 이동
        if graph[head_x][head_y] == 1:  # 사과 발견
            graph[head_x][head_y] = 0  # 먹음처리
            # continue -> 이거 있어서 오답
        else:  # 사과 없으면
            snake.pop()  # 축소(꼬리 삭제)
    else:  # 벽과 충돌
        print(cnt)
        break
    # 방향전환
    if cnt in change:  # 전환할 것이 있고, n초 경과
        turn = change[cnt]
        if turn == "D":  # 오른쪽 90도 회전
            dir = (dir + 1) % 4
        elif turn == "L":  # 왼쪽 90도 회전
            dir -= 1
            if dir < 0: dir = 3
    print(snake)

 

 

풀이

- 뱀을 deque()로 정의해서 구현

- while문을 사용해 계속해서 지나도록 구현

- 이동하는 경우(1초 경과) 몸을 늘리고 머리를 먼저 이동시키기 때문에 저장된 방향으로 이동

(방향은 동, 남, 서, 북 방향, dx dy 리스트로 저장)

- 그 다음 이동한 머리가 벽에 부딫히는 경우 cnt값을 출력 후 break

- 벽에 부딫히지 않는 경우 몸과 부딫히는지 체크(deque에 있는지 파악) -> 부딫히면 cnt값 출력 후 break

- 부딫히지 않는 경우 머리부분을 snake에 삽입 후 그래프에 사과가 있는지 체크

-> 사과가 있으면 그래프 위치에 있는 값을 0으로 만들고, 사과가 없으면 꼬리부분을 pop

 

- 이동 후 방향전환여부 체크

- 방향은 해시 형식으로 저장, cnt값이 해시에 있는 경우 값을 비교 -> D인지 L인지 비교한 다음 전환

 

 

알게된 점

- 빡구현이었고, 조건에 맞게 구현하는 것이 골자였다.

- 테케는 다 맞았는데 11퍼에서 계속 틀렸다.

- 그래서 봤는데 중간에 주석처리한 continue 때문에 방향전환을 패스해서 계속 틀리는 것이었다.

- 주석처리 했더니 통과

 

 

참고 사이트