Posts [baekjoon] 3190. 뱀 (python)
Post
Cancel

[baekjoon] 3190. 뱀 (python)

3190. 뱀 문제 바로가기

해결 방법

주요 과정

  1. 입력값을 통해 필요한 변수들을 설정을 한다.

    주요 변수 설명

    • board : 사과의 위치를 저장한 정사각 보드 리스트
    • y, x, d : 뱀의 머리 위치와 방향을 저장하는 변수 ★
    • snake_list : 뱀의 몸이 있는 좌표들을 저장하는 리스트
    • snake_info : 입력 L개의 줄에 나와있는 뱀의 방향 변환 정보를 저장한 리스트
  2. while 문을 통해 매 초 필요한 뱀의 동작을 구현한다.

    • 종료 조건

      • 뱀이 자기자신과 만나는 경우
      • 벽에서 벗어난 경우
    • 뱀의 주어진 방향(d) 만큼 진행시키며 종료 조건이 아닐 때

      1. 사과 유무에 따라 동작한다.
        • 사과 있으면 사과를 없앤다.
        • 사과 없으면 몸 길이가 줄기에 snake_list 맨 앞의 인덱스(처음 저장된 값이기에 꼬리 부분!)를 제거한다.
    • snake_info 에 저장된 특정한 게임 시작 시간에 따라 뱀의 방향을 회전시킨다.

      ※ 주의 : info < len(snake_info) 가 없을 경우 런타임 에러(IndexError) 발생!

      1
      2
      3
      4
      5
      6
      
      if info < len(snake_info) and time == snake_info[info][0]: # 방향 변환을 해야할 때
          if snake_info[info][1] == "L": # 왼쪽으로 방향을 돌리기
            d = (d + 1) % 4
          else: # 오른쪽으로 방향 돌리기
            d = (d + 3) % 4
          info += 1
      

구현한 코드

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
N = int(input())
board = [[0]*N for _ in range(N)]
snake_info = []
y, x, d = 0, 0, 0 # 뱀이 머리 위치 좌표와 방향 저장할 변수
snake_list = [[0, 0]] # 뱀이 어디에 있는지 좌표를 저장할 리스트
dirs = [[0, 1], [-1, 0], [0, -1], [1, 0]]
info = 0 
time = 0

# 사과 위치 저장하기
for _ in range(int(input())):
  i, j = map(int, input().split())
  board[i-1][j-1] = 1
    
# 뱀의 방향 정보 저장하기
for _ in range(int(input())):
  X, C = map(str, input().split())
  snake_info.append([int(X), C])

while True:
  time += 1
  y, x = y + dirs[d][0], x + dirs[d][1]
  # 종료조건
  if [y, x] in snake_list: break # 뱀이 자기자신과 만날 경우
  if y < 0 or x < 0 or y >= N or x >= N: # 벽에서 벗어난 경우
    break

  if board[y][x]== 1: # 사과일 경우
    board[y][x] = 0 
  else:
    snake_list.pop(0) # 사과가 없기에 뱀의 꼬리 부분이 이동하여 빼주기

  snake_list.append([y, x]) # 뱀의 머리 부분 저장

  if info < len(snake_info) and time == snake_info[info][0]:
    if snake_info[info][1] == "L": # 왼쪽으로 방향을 돌리기
      d = (d + 1) % 4
    else: # 오른쪽으로 방향 돌리기
      d = (d + 3) % 4
    info += 1

print(time)
This post is licensed under CC BY 4.0 by the author.

[baekjoon] 13458. 시험감독 (python)

[baekjoon] 19236. 청소년 상어 (python)

Comments powered by Disqus.