[이것이 코딩 테스트다 with Python] Chapter 12. 구현 - 뱀

2023. 12. 8. 11:28·코딩테스트/이것이 코딩 테스트다
반응형

< 뱀 >

 

💬 문제 설명

'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다.
....

 

  입력   출력
  6
  3
  3    4
  2    5
  5    3
  3
  3    D
  15  L
  17  D
  9
  10
  4
  1    2
  1    3
  1    4
  1    5
  4
  8    D
  10  D
  11  D
  13  L
  21

💬 입력 조건

  • 첫째 줄에 보드의 크기 N ( 2 ≤ N ≤ 100 )
  • 둘째 줄에 사과의 개수 K ( 0 ≤ K ≤ 100 )
  • 다음 K개의 줄에는 사과의 위치가 "행  열"로 주어진다. ( 사과의 위치는 다 다르고, 1행 1열은 사과가 없음 ) 
  • 다음 줄에는 뱀의 방향 변환 횟수 L ( 0 ≤ K ≤ 100 )
  • 다음 L개의 줄에는 뱀의 방향 변환 정보가 "정수 X와 문자 C"로 주어진다.
  • 게임 시작기준 X ( 0 ≤ K ≤ 10,000 )초가 끝난 뒤에 C(L왼쪽, D오른쪽)로 90도 회전.

💬 출력 조건

  • 첫째 줄에 게임이 몇 초에 끝나는지 출력.

✍ 문제요약

"Dummy" 라는 도스 게임이다. 뱀이 기어 다니면서 사과를 먹고, 사과 하나당 뱀의 길이가 1씩 늘어난다. 뱀이 기어 다니다가 벽 이나 자기 자신과 부딪히면 게임이 끝난다. 게임은 N x N 보드 위에서 진행이 되고 (0, 0) 위치에서 뱀 길이가 1인 상태로 시작한다. 사과의 위치와 뱀이 이동하는 조건이 입력으로 주어질 때 게임이 몇 초에 끝나는지 구해야한다.

💯 문제링크

백준3190 문제와 동일하다.

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

 

3190번: 뱀

'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net


✅  문제 풀이

  • 게임이 플레이되는 방식 그대로 구현했다.
  • N x N 크기의 빈 board를 만들어 사과의 위치를 표시한다.
  • 뱀의 위치를 리스트에 저장하고, 방향과 현재 시간도 초기화 한다.
  • 뱀위 움직임을 표현하는 입력에 대해서, 뱀이 움의 움직임을 board에 표현하기 위한 snakeMove() 함수를 만든다.
  • snakeMove
    • 1초 마다 뱀의 정보를 업데이트한다.
    • 뱀이 앞으로 한 칸 전진한다 가정하고, 정보를 업데이트
    • 전진한 상태에서 사과의 유무에 따하 뱀의 정보를 다시 업데이트한다.
    • 만약 벽이나, 자신의 몸에 부딪히면 stop
from collections import deque

# N 크기 만큼 G(빈 보드) 만들기
N = int(input())
G = [[0] * N for _ in range(N)]

# 사과의 위치 표시하기
for _ in range(int(input())):
    r, c = map(int,input().split())
    G[r-1][c-1] = 1

def snakeMove():
    global time, stop, d
    r, c = snake[-1][0], snake[-1][1] # 현재 뱀 머리 위치
    nr, nc = r + dr[d], c + dc[d]     # 다음 뱀 머리 위치
    snake.append((nr, nc))            # 다음 뱀 머리 위치 담기
    G[r][c] = 2                       # 현재 뱀 꼬리 표시
    time += 1                         # 1초 흐름

    # 뱀이 벽 or 자기 몸에 부딫히면 stop
    if nr < 0 or nr >= N or nc < 0 or nc >= N or G[nr][nc] == 2:
        stop = 1
        return

    # 이동 위치에 사과가 없을 때
    if G[nr][nc] == 0:
        br, bc = snake.popleft() # 꼬리를 잘라서
        G[br][bc] = 0            # G에는 0으로 표시한다.

dr = [0, 1, 0, -1]
dc = [1, 0, -1, 0]     # 우 하 좌 상
snake = deque([(0,0)]) # 뱀 시작위치
time = stop = d = 0    # 총 시간, 뱀 방향

for _ in range(int(input())):
    move, dire = map(str,input().split())
    for _ in range(int(move) - time):
        snakeMove()
        if stop == 1: break
    if stop == 1 : break

    # 방향 전환
    if dire == "D" : d = ( d + 1 ) % 4
    else : d = ( d + 3 ) % 4

# 방향 전환 정보를 다 체크했는데도 게임이 안 끝났을 때
while stop == 0:
    snakeMove()

print(time)
반응형

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

[이것이 코딩 테스트다 with Python] Chapter 12. 구현 - 치킨배달  (0) 2023.12.13
[이것이 코딩 테스트다 with Python] Chapter 12. 구현 - 기둥과 보 설치  (2) 2023.12.12
[이것이 코딩 테스트다 with Python] Chapter 12. 구현 - 자물쇠와 열쇠  (1) 2023.12.08
[이것이 코딩 테스트다 with Python] Chapter 12. 구현 - 문자열 압축  (4) 2023.12.06
[이것이 코딩 테스트다 with Python] Chapter 12. 구현 - 문자열 재정렬  (4) 2023.12.03
'코딩테스트/이것이 코딩 테스트다' 카테고리의 다른 글
  • [이것이 코딩 테스트다 with Python] Chapter 12. 구현 - 치킨배달
  • [이것이 코딩 테스트다 with Python] Chapter 12. 구현 - 기둥과 보 설치
  • [이것이 코딩 테스트다 with Python] Chapter 12. 구현 - 자물쇠와 열쇠
  • [이것이 코딩 테스트다 with Python] Chapter 12. 구현 - 문자열 압축
hyo_nu
hyo_nu
Annoying Orange Developer
  • hyo_nu
    AOD
    hyo_nu
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 코딩테스트
        • 이것이 코딩 테스트다
        • 알고리즘
      • Style Sheet
        • CSS
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

    • Github
    • Velog
  • 공지사항

  • 인기 글

  • 태그

    브루트포스
    이진탐색
    그리기
    이것이 취업을 위한 코딩테스트다
    dp
    취업
    BFS
    코딩테스트
    그리디
    코딩테스트다
    코딩
    정렬
    dfs
    python
    Algorithm
    구현
    알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
hyo_nu
[이것이 코딩 테스트다 with Python] Chapter 12. 구현 - 뱀
상단으로

티스토리툴바