[JS] Javascript로 인접리스트를 만들어보자!

코린·2023년 10월 25일
0

JavaScript

목록 보기
1/3
post-thumbnail

🚨 JS 로 인접리스트 만들 때 주의!

[백준]촌수계산 문제를 풀 때 인접리스트를 구현하고 싶었는데 잘 안되더랍니다..

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

let n = Number(input.shift());
let [a, b] = input.shift().split(" ").map(Number);
let arrList = Array(n).fill([]);

let arrSize = Number(input.shift());

for (let i = 0; i < arrSize; i++) {
  let [idx, value] = input.shift().split(" ").map(Number);

  arrList[idx].push(value);
}

console.log(arrList);

위와 같이 코드를 짰습니다. []로 초기화를 해주면 인접리스트를 만들 수 있지 않을까 하고 출력해보니...??

[
  [
    2, 3, 7, 8,
    9, 5, 6
  ],
  [
    2, 3, 7, 8,
    9, 5, 6
  ],
  ...뒤에 생략

아니 다 똑같은 값이 들어가있는거에요;;; 정말 나 원참... 바보같은 나...

원인은 바로

let arrList = Array(n).fill([]);

이것입니다.

위와 같이 초기화를 하면 모든 원소가 동일한 배열을 참조하게 됩니다. 따라서 제가 분리해준게 의미가 한개도 없는게 되버립니다...

let arrList = [];

for (let a = 0; a < arrSize; a++) arrList[a] = [];

이렇게 써줘야! 제가 원하는 방식으로 동작합니다.

✌️ 맞는 코드

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

let n = Number(input.shift());
let [a, b] = input.shift().split(" ").map(Number);
let arrList = [];

let arrSize = Number(input.shift());

for (let a = 0; a < arrSize; a++) arrList[a] = [];

for (let i = 0; i < arrSize; i++) {
  let [idx, value] = input.shift().split(" ").map(Number);

  arrList[idx].push(value);
}

console.log(arrList);

✌️ map 으로 구현하기

let arrList = Array(n).fill(null).map(() => []);

map을 사용해서 위처럼 구현해도 인접리스트를 생성할 수 있습니다.

profile
안녕하세요 코린입니다!

0개의 댓글