PS/백준

백준 / 정렬 / 2587번 / 대표값2 / JS

KimMinJun 2023. 2. 5. 22:49

< 문제 바로가기 >

 

2587번: 대표값2

어떤 수들이 있을 때, 그 수들을 대표하는 값으로 가장 흔하게 쓰이는 것은 평균이다. 평균은 주어진 모든 수의 합을 수의 개수로 나눈 것이다. 예를 들어 10, 40, 30, 60, 30의 평균은 (10 + 40 + 30 + 60 +

www.acmicpc.net

 

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

const NUMBER_LIST = input.map(Number);

function solution(NUMBER_LIST) {
  let sortedNumberList = [...NUMBER_LIST].sort((a, b) => a - b);

  let avg = 0;
  let median = 0;

  avg = sortedNumberList.reduce((acc, cur) => acc + cur);
  avg /= sortedNumberList.length;

  median = sortedNumberList.at(Math.floor(sortedNumberList.length / 2));

  console.log(avg);
  console.log(median);
}

solution(NUMBER_LIST);

사실 원본 배열이 바뀌어도 문제풀이에 지장이 없지만, 인자로 넘겨준 NUMBER_LIST를 그냥 sort 하게 되면 solution() 함수 바깥에 존재하게 되는 NUMBER_LIST가 바뀌어버린다. 따라서 전개구문을 이용하면 깊은복사를 수행하게 되면서 원래의 값들을 참조하는게 아닌 값들을 복사해서 메모리의 새로운 공간에 올려놓기 때문에 다른 참조값이 된다.

 

하지만 이 전개구문을 사용할때에도 주의점이 있는데, 대상이 1차원 배열일 경우에만 깊은복사가 가능하다는것이다. 2차원 배열은 안에 있는 원소들은 결국 1차원 배열들이다. 배열이라는 의미는 참조값이라는 의미인데, 2차원 배열을 전개할시에 1차원 배열의 참조값을 그대로 가져오므로 결국 원본도 변하게 된다. 따라서 2차원 배열을 복사하고 싶을 경우에는 새로운 배열을 생성 후에 반복문을 통해 각각의 값을 직접 넣어주거나, 안에 있는 요소들에게도 전개구문을 이용해서 복사를 해주어야 한다.