어디까지 갈 수 있을까?
[구현] 백준 3190 뱀 본문
문제링크 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]*n 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=[[1, 0], [0, 1], [-1, 0], [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
'알고리즘 > 문제' 카테고리의 다른 글
[DP] 백준 14501 퇴사 (0) | 2021.03.24 |
---|---|
[브루트포스] 백준 1038 감소하는 수 (0) | 2021.03.18 |
[구현] 프로그래머스 문자열 압축 (1) | 2021.03.05 |
[그리디] 프로그래머스 무지의 먹방 라이브 (0) | 2021.03.04 |
[Union-Find] 백준 10775 공항 (0) | 2021.03.02 |
Comments