국문과 유목민

[구현] 뱀 본문

알고리즘_코딩테스트/이것이 코딩테스트다

[구현] 뱀

논곰 2021. 12. 13. 22:57
"이것이 코딩테스트다(나동빈 저)"에서 나온 문제에 대한 코드를 다루고 있습니다.
문제에 대한 구체적인 설명과 조건 등은 책을 참고해주시기 바랍니다.

소요시간: 1시간 30분 정도 (40분 + 거의 오류 잡는데 40분 +  a)

1. 문제 설명

- dummy라는 게임을 구현하는 문제 사과를 먹으면 길이가 늘어나고, 벽이나 자기 몸에 부딪히면 게임 끝

2. 접근 방식

- 뱀의 몸의 경우 deque를 이용해서 길이를 늘려간다. 만약 자기 몸에 부딪히는 경우는 deque에 들어가는 파라메터가 이미 존재하는 경우로 생각했다.

- 초기에 뱀의 움직임을 deque에다가 넣어서 'while deque:' 로 큐가 빌 때까지로 작성하다가, 방향이 바뀌지 않으면 계속 한 방향으로 이동한다는 조건이 있어서 while True로 바꾸고, 뱀의 움직임은 dict형으로 만들었다. 

3. 코드

from collections import deque
n = int(input())
m = int(input())
apple_list = [[False]*n for _ in range(n)]

for _ in range(m):
    x, y = map(int, input().split())
    apple_list[x-1][y-1] = True
    
l = int(input())
q = {}
for _ in range(l):
    x, c = input().split()
    q[int(x)]=c
    
def check_direction(dir_index, direction):
    if direction == "D":
        dir_index +=1        
    elif direction == "L":
        dir_index -= 1
    dir_index %= 4
    return dir_index

x, y = 0, 0
snake_body = deque()
snake_body.append((0,0))
dir_index = 0
# 동 남 서 북 (행, 열  / x가 행, y가 열)
x_dir = [0, 1, 0, -1]
y_dir = [1, 0, -1, 0]
time = 0

while True: # 움직일 수 있는 동안
    if time in q:
        dir_index = check_direction(dir_index, q[time])
    time += 1
    x, y = x + x_dir[dir_index], y + y_dir[dir_index]
    if ((x, y) in snake_body) or x >= n or y >= n or x < 0 or y < 0: # 탈출문
        break
    else:
        snake_body.append((x, y))
        if apple_list[x][y] == True:
            apple_list[x][y]= False
            continue
        else: 
            snake_body.popleft()
print(time)

4. 코멘트

- 예전에 풀었으나 기억이 안 났다. 하지만 예전과 다르게 이번에는 내 손으로 풀었다.
- 백준에서 계속 런타임 에러(NameError)가 떠서 무슨 문제가 있었나 했는데, 변수를 잘못쓰는 오류가 있었다.
- 하지만 덕분에 코드를 더 간추릴 수도 있었고, 부족했던 부분을 보완할 수 있었다.
- 이번 코드에서 deque와 dict형을 사용해 문제를 풀었다는 점에서 나름 만족스럽다. 

'알고리즘_코딩테스트 > 이것이 코딩테스트다' 카테고리의 다른 글

[구현] 치킨 배달  (0) 2021.12.15
[구현] 기둥과 보 설치  (0) 2021.12.13
[구현] 자물쇠와 열쇠  (0) 2021.12.13
[구현] 문자열 압축  (0) 2021.12.13
[구현] 문자열 재정렬  (0) 2021.12.13