[백준]촌수계산 문제를 풀 때 인접리스트를 구현하고 싶었는데 잘 안되더랍니다..
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);
let arrList = Array(n).fill(null).map(() => []);
map을 사용해서 위처럼 구현해도 인접리스트를 생성할 수 있습니다.