백준 3190 < 뱀 > JavaScript

2023. 3. 7.·☕️ 커리어 & 인터뷰 준비/코딩 테스트

📍문제 링크

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

 

3190번: 뱀

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

www.acmicpc.net

 

📍알고리즘 분류

- 구현
- 자료 구조
- 시뮬레이션
- 덱
- 큐

 

📍문제 풀이

- 가상의 좌표평면에서 사과 위치의 좌표 리스트, 방향 전환 (turn left, turn right)이 발생하는 시간 리스트가 주어진다

- 뱀이 1행 1열에서 시작하여 우측방향으로 1초마다 움직인다, 사과를 먹을 경우 길이가 1칸 늘어난다

- 벽에 부딪히면 게임이 끝난다

- 자기 몸체에 부딪히면 게임이 끝난다

 

게임이 몇 초에 끝나는지 구하라

 

복잡한 구현문제.. 덱 자료구조를 이용하여 해결할 수 있다

덱을 뱀의 몸체라고 생각하고, 좌표를 담는 배열로 정의한다

뱀이 이동하면 unshift와 pop을 사용하여 전진 이동을 구현하면 된다

 

📍코드 (JavaScript)

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const input = [];
// deque
const snakeBody = [[0, 0]];
// 상우하좌 (시계방향)
const dy = [-1, 0, 1, 0];
const dx = [0, 1, 0, -1];

// 컨트롤러 변수
let currentDirection = 1; // 기본값 우방향
let seconds = 0;
let isApple;
let collision = false;

// L or D를 받아서 전역 현재 방향 변수를 0 1 2 3 중 하나로 한 칸 바꿈
const turn = (LD) => {
  if (LD === "L")
    currentDirection = currentDirection ? currentDirection - 1 : 3;
  if (LD === "D")
    currentDirection = currentDirection === 3 ? 0 : currentDirection + 1;
};

rl.on("line", (line) => {
  input.push(line);
}).on("close", () => {
  const N = +input[0];
  const appleNum = +input[1];
  let applePosList = input
    .slice(2, 2 + appleNum)
    .map((el) => el.split(" ").map(Number));
  const directionNum = +input[appleNum + 2];
  const directionList = input.slice(appleNum + 3).map((el) => {
    const directionInfo = el.split(" ");
    return [+directionInfo[0], directionInfo[1]];
  });
  while (true) {
    isApple = false;
    const newY = snakeBody[0][0] + dy[currentDirection];
    const newX = snakeBody[0][1] + dx[currentDirection];
    // 벽 충돌 검사
    if (newY < 0 || newY >= N || newX < 0 || newX >= N) break;
    // 몸체 충돌 검사
    snakeBody.forEach((body) => {
      if (body[0] === newY && body[1] === newX) {
        collision = true;
      }
    });
    if (collision) break;
    // 사과 검사
    // 사과인 경우 pop X, unshift O
    applePosList.forEach((applePos, idx) => {
      if (applePos[0] - 1 === newY && applePos[1] - 1 === newX) {
        applePosList.splice(idx, 1);
        snakeBody.unshift([newY, newX]);
        isApple = true;
      }
    });
    // 사과가 아닌 경우 pop O
    if (!isApple) {
      snakeBody.unshift([newY, newX]);
      snakeBody.pop();
    }
    seconds++;
    // 방향 전환
    if (directionList.length && seconds === directionList[0][0]) {
      turn(directionList[0][1]);
      directionList.shift();
    }
  }
  console.log(seconds + 1);
});

 

📍리뷰

- 클래스로 멋있게 구현하고 싶지만.. 쉽지 않다

'☕️ 커리어 & 인터뷰 준비/코딩 테스트' 카테고리의 다른 글
  • 백준 1094 < 막대기 > JavaScript
  • 백준 11048 < 이동하기 > JavaScript
  • 백준 14502 < 연구소 > JavaScript
  • 백준 1011 < Fly me to the Alpha Centauri > JavaScript
지식물원
지식물원
지식이 자라는 식물원!
  • 지식물원
    지식물원
    지식물원
  • 전체
    오늘
    어제
    • 분류 전체보기 (516)
      • 🎨 프론트엔드 공부 (253)
        • JS & TS (92)
        • HTML & CSS (22)
        • React & Next (49)
        • Vue & Nuxt (22)
        • 기타 (68)
      • 🤓 기술 학습 & 공부 기록 (116)
        • Node.js (0)
        • Python (37)
        • 백엔드 (0)
        • 딥러닝 (1)
        • 컴퓨터 일반 (72)
        • 개발 인프라 (6)
      • 👨‍💻 프로젝트 경험 (6)
        • Work (0)
        • Toy (6)
      • ⚙️ 개발 팁 & 노하우 (21)
        • 프론트엔드 (6)
        • 기타 (15)
      • ☕️ 커리어 & 인터뷰 준비 (88)
        • 코딩 테스트 (88)
      • 📰 기술 트렌드 & 생각 정리 (4)
      • 📚 기타 (25)
        • 마케팅 (15)
        • 비개발서적 (10)
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

    • 모바일 접속 시 코드 하이라이팅 깨질 때
  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
지식물원
백준 3190 < 뱀 > JavaScript
상단으로

티스토리툴바