3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
알고리즘 : 시뮬레이션, 구현
이문제는 구현하는 데는 어렵지 않았는데 처음에 문제를 잘 못 이해해서 힘들었다.
이동경로의 시간이 게임시작으로 부터 지난 시간인데, 그 시간만큼 진행 후 방향을 바꿔야 하는 줄 알고 고민했다...
문제만 잘읽는 것이 아니라 예제도 잘 봐야 할 것 같다.
- Javascript
function solution() {
let input = require("fs")
.readFileSync("input.txt") //"/dev/stdin"
.toString()
.split("\n")
.map((val) => val.trim());
let n = +input.shift();
let k = +input.shift();
let apple = [];
for (let i = 0; i < k; i++) {
[x, y] = input
.shift()
.split(" ")
.map((v) => +v);
apple.push([x - 1, y - 1]);
}
let l = +input.shift();
let move = [];
for (let i = 0; i < l; i++) {
[x, y] = input.shift().split(" ");
move.push([+x, y]);
}
const dx = [-1, 0, 1, 0];
const dy = [0, 1, 0, -1];
let dir = 1;
let time = 0;
let snake = [[0, 0]];
let cnt = 0;
while (1) {
let [t, c] = move[cnt];
if (t === time) {
if (c === "D") {
dir = (dir + 1) % 4;
} else dir = dir === 0 ? 3 : (dir - 1) % 4;
if (cnt < l - 1) cnt++;
}
time++;
let [x, y] = snake.at(-1);
let nx = x + dx[dir];
let ny = y + dy[dir];
if (nx < 0 || nx >= n || ny < 0 || ny >= n || snake.find((v) => v[0] === nx && v[1] === ny)) {
console.log(time);
break;
}
let idx = apple.findIndex((v) => v[0] === nx && v[1] === ny);
if (idx !== -1) {
apple.splice(idx, 1);
} else {
snake.shift();
}
snake.push([nx, ny]);
}
}
solution();
-Python
import sys
from collections import deque
sys.stdin = open("baekjoon/3190/input.txt","r")
input = sys.stdin.readline
# 처음에 0,0시작 방향 오른쪽
# 뱀은 매초마다 이동하면서 다음과 같은 규칙을 따른다.
# 몸길이를 늘려 머리를 다음 칸에 위치한다.
# 이동한 칸에 사과가 있으면 사과가 없어지고 꼬리는 움직이지 않는다.
# 사과가 없으면 몸길이를줄요서 꼬리가 위치한 칸을 비워준다. -> 즉 몸길이는 고정
n=int(input())
k=int(input())
apple=[]
for i in range(k):
[x,y] = list(map(int,input().split()))
apple.append([x-1,y-1])
l=int(input())
snake=[]
for i in range(l):
[x,c] = list(input().split())
snake.append([int(x),c])
sp=deque()
sp.append([0,0])
#북 0 동 1 남 2 서 3
d=1
# 뱀을 이동시키면서 cnt를 증가 -> 사과 검사 -> 게임끝나는 조건 검사
lCnt=0
time=0
dx=[-1,0,1,0]
dy=[0,1,0,-1]
while(1):
[t,c] = snake[lCnt]
if(t==time):
if c=="D":
d=(d+1)%4
else:
d = 3 if d == 0 else (d - 1) % 4
if(lCnt<l-1):
lCnt+=1
time+=1
[x,y]=sp.pop()
sp.append([x,y])
nx=x+dx[d]
ny=y+dy[d]
# 게임 종료 조건
if(nx<0 or nx>=n or ny<0 or ny>=n or [nx,ny] in sp):
print(time)
break
# 사과 검사
if any([nx,ny] == sublist for sublist in apple):
apple.remove([nx,ny])
else:
sp.popleft()
sp.append([nx,ny])
x=nx
y=ny
'코딩테스트(알고리즘) > baekjoon' 카테고리의 다른 글
[baekjoon] 20055 컨테이어 벨트 위의 로봇 (Javascript, Python) (0) | 2023.03.25 |
---|---|
[baekjoon] 14499 주사위 굴리기 (Javascript,Python) (0) | 2023.03.14 |
[baekjoon] 14888 연산자 끼워넣기 (Javascript,Python) (0) | 2023.03.10 |
[baekjoon] 1520 내리막 길 (Javascript,Python) (0) | 2023.03.03 |
[baekjoon] 1987 알파벳 (Javascript,Python) (0) | 2023.03.02 |