반응형
< 뱀 >
💬 문제 설명
'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 |
