알고리즘 연습

[알고리즘 연습] 백준 15787 (기차가 어둠을 헤치고 은하수를, 자바스크립트)

산본개발자 2023. 5. 23. 13:24

문제

 

15787번: 기차가 어둠을 헤치고 은하수를

입력의 첫째 줄에 기차의 수 N(1 ≤ N ≤ 100000)과 명령의 수 M(1 ≤ M ≤ 100000)가 주어진다. 이후 두 번째 줄부터 M+1번째 줄까지 각 줄에 명령이 주어진다. 

www.acmicpc.net


풀이

  • N개의 기차의 20개의 열을 모두 0으로 초기화한다.
  • M개의 명령을 모두 수행하여 기차의 상태를 변경한다.
  • set 자료구조를 통해 중복되는 기차의 상태를 제거한다.

소스 코드

const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = require("fs")
  .readFileSync(filePath)
  .toString()
  .trim()
  .split("\n");

const [N, M] = input[0].split(" ").map((el) => +el);
const train = Array.from({ length: N }, () => Array(20).fill(0));
const command = [];
const set = new Set();

for (let i = 1; i <= M; i++) {
  const [a, b, c] = input[i].split(" ").map((el) => +el);

  command.push([a, b, c]);
}

for (const [type, i, x] of command) {
  if (type === 1) {
    train[i - 1][x - 1] = 1;
  } else if (type === 2) {
    train[i - 1][x - 1] = 0;
  } else if (type === 3) {
    for (let j = 19; j >= 1; j--) {
      train[i - 1][j] = train[i - 1][j - 1];
    }
    train[i - 1][0] = 0;
  } else if (type === 4) {
    for (let j = 0; j <= 18; j++) {
      train[i - 1][j] = train[i - 1][j + 1];
    }
    train[i - 1][19] = 0;
  }
}

for (const target of train) {
  const str = target.join("");

  set.add(str);
}

console.log(set.size);

/*
  [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
*/