어디까지 갈 수 있을까?

[구현] 백준 3190 뱀 본문

알고리즘/문제

[구현] 백준 3190 뱀

_Min 2021. 3. 11. 11:26

문제링크 www.acmicpc.net/problem/3190

 

사과를 먹으면 몸이 길어지는 뱀이 몇 초부터 이동을 못하게 되는지 구하는 문제이다

 

 

[답코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import sys
input=sys.stdin.readline
 
n=int(input()) #보드의 크기
 
board=[[-1]*for i in range(n)]
# print(board)
 
#사과의 위치
for _ in range(int(input())):
    a, b=map(int, input().split())
    board[a-1][b-1]=-4
# print(board)
 
#뱀의 방향 변환
#x초 뒤 l 왼쪽, d 오른쪽 90도 회전
snake_loc=[]
for _ in range(int(input())):
    a, b = input().split()
    snake_loc.append([int(a), b])
# print(snake_loc)
 
#동 남 서 북
#0 1 2 3
go=[[10], [01], [-10], [0-1]]
head, tail=[0,0], [0,0]
cur=0 #방향
time=0
board[0][0]=0
while True:
    if snake_loc and time==snake_loc[0][0]:
        if snake_loc[0][1]=='L':
            cur-=1
        else:
            cur+=1
        if cur<0:
            cur=3
        elif cur>3:
            cur=0
        snake_loc.pop(0)
    #go
    #행, 열
    head[0]+=go[cur][1]
    head[1]+=go[cur][0]
 
    row, col = head[0], head[1]
 
 
    #벽에 부딪힘
    #본인 한테 부딪힘
    if row>len(board)-1 or row<0 or col>len(board)-1 or col<0 or board[row][col]>=0 :
        break
    else:
        # 사과가 있으면
        if board[row][col]==-4:
            board[row][col] = time + 1
        else:
            #꼬리 줄이기
            #오른쪽부터 보기
            # 동 남 서 북
            # 0 1 2 3
            # go = [[1, 0], [0, 1], [-1, 0], [0, -1]]
            board[row][col] = time + 1
            k = 0
            t_row = tail[0]
            t_col = tail[1]
            while True:
                t_row_next=t_row+go[k][1]
                t_col_next=t_col+go[k][0]
                if len(board)>t_row_next>=0 and len(board)>t_col_next>=0 and board[t_row][t_col]+1==board[t_row_next][t_col_next]:
                    board[t_row][t_col]=-1
                    tail[0]= t_row_next
                    tail[1]= t_col_next
                    break
                k+=1
                if k > 3:
                    k=0
 
    # print('##')
    time += 1
    # [print(i) for i in board]
#게임이 몇 초 후에 끝나는지 출력
print(time+1)
cs

 

 

 

[풀이법]

전체 board를 -1로 초기화하고 사과가 있는 위치에는 -4 값을 넣어놨다

뱀이 현재 차지하고 있는 공간에는 양수값들을 넣어 본인몸과 충돌하거나 board 판을 넘어가면 break 되게 했다

 

꼬리의 경우 오른쪽부터 사방을 돌아 자신의 값+1=다음 칸 값이면,

자신의 위치를 다음 칸으로 옮기고 자신의 위치에는 -1을 넣게 했다

 

예제 입력 1로 게임을 진행하면

 

0초
1초
2초
3초
4초
5초
6초
7초
8초
9초 게임 끝

 

구현 문제는 보드판과 동남북서 방향으로 움직이면 어느 좌표에 도달하게 되는지, row/col값, 현재 좌표값과 다음갈 좌표값을 따로 변수에 담아 만들면 좀 더 수월한 것 같다.

 

까다롭긴 하지만 한 칸씩 step이 진행될 때마다 print() 해주면 코드의 어느 부분에서 틀렸는지 알 수 있어 편한 것 같다

728x90
Comments