본문 바로가기
코딩테스트(알고리즘)/baekjoon

[baekjoon] 3190 뱀 (Javascript,Python)

by Cafe Mocha 2023. 3. 15.

3190번: 뱀 (acmicpc.net)

 

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