web/javascript prac with BOJ

[BOJ 1회독] 자바스크립트 1차원 배열

xudegloss 2023. 3. 27. 02:01
목차

1. 배열 만들기.

2. 변수로 제작하기.
3. 데이터 받아올 때 trim 이용하기.
4. 구조 분해 할당
5. splice로 기존의 배열 변경하기.
6. reduce로 배열의 요소에 함수 적용하여 하나의 결과값 반환하기.

1. map(Number)로 배열 만들기

데이터가 띄어쓰기로 여러 개 있는 경우, map(Number)를 이용하여 배열로 만들 수 있다. 배열은 반복문에 유용하다.

2. 변수로 제작하기

뭔가 길어지는 느낌이 나면 변수에 담아서 이용하기. 그렇지 않으면 시간 초과 뜨는 경우가 생길 수도 있다.

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "/input.txt";

let input = fs
  .readFileSync(__dirname + filePath)
  .toString()
  .split("\n");

let num = parseInt(input[0].split(" ")[1]); // 5
let answer = [];
let arr = input[1].split(" ");

for (let i = 0; i < arr.length; i++) {
  if (arr[i] < num) {
    answer.push(arr[i]);
  }
}

// 한 줄에 모두 적으려고 하지 말고 리스트에 담은 후에 join 이용하기.
// 시간 초과 뜬다.
console.log(answer.join(" "));

3. 데이터 1개인 경우 trim 이용하기

  • trim : 문자열 양 끝의 공백 제거하고, 원본 문자열을 수정하는 대신에 새로운 문자열을 반환한다.
  • 이유는 잘 모르겠는데, trim을 사용하는 것이 좋아보인다. toString() 뒤에 trim 꼭 붙여주기.

나머지 문제를 풀이할 때에 trim은 안 쓰다가 사용하니 정답이 되었다. 꼭 사용해주기.

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "/input.txt";

let input = fs
  .readFileSync(__dirname + filePath)
  .toString()
  .trim()
  .split("\n")
  .map(Number);
let result = [];

for (let idx = 0; idx < input.length; idx++) {
  result.push(input[idx] % 42);
}

let answer = new Set(result);
console.log(answer.size);

4. 구조 분해 할당 - Swap

값을 서로 변경시키는 경우에 유용하다.

[a, b] = [b,a] // 구조 할당 분해

 

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "/input.txt";

let input = fs
  .readFileSync(__dirname + filePath)
  .toString()
  .split("\n");

let N = Number(input[0].split(" ")[0]);
let M = Number(input[0].split(" ")[1]);

let answer = [];
for (let i = 0; i < N; i++) {
  answer.push(i + 1);
}

for (let iter = 0; iter < M; iter++) {
  let arr = input[iter + 1].split(" ");

  if (arr[0] !== arr[1]) {
    // 구조 분해 할당 사용하기. (Swap)
    [answer[arr[0] - 1], answer[arr[1] - 1]] = [
      answer[arr[1] - 1],
      answer[arr[0] - 1],
    ];
  }
}

console.log(answer.join(" "));

5. splice로 기존의 배열 변경하기

문제 해결 방법
1. 역순으로 변경되는 부분 : slice를 이용하여 가져왔다. 하지만 slice로 원본 배열을 변경하기 힘들다는 사실을 알게 되었다.
2. 원본 배열을 변경하는 splice를 이용하여 역순으로 변경된 부분 + 원본 배열 변경을 한 번에 해결하였다.
splice(startIndex, deleteCount, add하는 부분)
3. deleteCount를 세어줄 때 유의하기. 마지막 상자 - 첫 번째 상자 + 1 처리하기.
4. join 이용하여 원하는 모양으로 변경하기.

만약에 slice로 받아서 add하는 부분을 만들 수 있다면 slice와 splice를 같이 사용할 수 있을 것이다.

 

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "/input.txt";

let input = fs
  .readFileSync(__dirname + filePath)
  .toString()
  .trim()
  .split("\n");

let N = Number(input[0].split(" ")[0]);
let M = Number(input[0].split(" ")[1]);

let answer = [];
for (let i = 0; i < N; i++) {
  answer.push(i + 1);
}

// 역순으로 만들 바구니 가져오기.
for (let iter = 1; iter <= M; iter++) {
  // 역순으로 변경할 인덱스 의미한다.
  // a : 첫 번째 바구니 위치
  // b : 마지막 바구니 위치
  let [a, b] = input[iter].split(" ").map((n) => parseInt(n));
  // console.log(`${a} ${b}`);
  let arr = [];

  for (let j = a - 1; j < b; j++) {
    arr.push(answer[j]);
  }
  arr.reverse(); // 역순으로 변경된 바구니를 의미한다.

  // .splice(startIndex, deleteCount, add할 것 (arr 의미한다.))
  answer.splice(a - 1, b - a + 1, ...arr);
  console.log(answer);
}

console.log(answer.join(" "));

6. reduce로 합계 구하기

js에는 python처럼 집계 함수가 따로 있는 것이 아니라서 reduce 함수를 이용하여 배열의 요소 합계를 구하였다.

// reduce 함수로 합계 구하기.
const arr_sum = new_arr.reduce(function add(init, currValue) {
  return init + currValue; // currValue : 배열의 요소를 의미한다.
}, 0); // 초기값 꼭 넣어주기.

 

reduce는 배열의 각 요소에 reduce 함수를 실행하고, 나중에 하나의 결과값으로 반환한다.

 

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "/input.txt";

let input = fs
  .readFileSync(__dirname + filePath)
  .toString()
  .trim()
  .split("\n");

let N = Number(input[0]);
let arr = input[1].split(" ").map(Number);

// Math.max.apply(null, arr);
let max = Math.max.apply(null, arr);
let new_arr = [];

for (let i = 0; i < arr.length; i++) {
  new_arr.push((arr[i] / max) * 100);
}

// reduce 함수로 합계 구하기.
const arr_sum = new_arr.reduce(function add(init, currValue) {
  return init + currValue;
}, 0);

console.log(arr_sum / N);