백준 3052번 JavaScript 문제풀이

Cho Dragoo·2021년 5월 13일
0
post-thumbnail

JavaScript 백준 온라인 알고리즘 공부

백준 3052 번 JavaScript 문제

나머지
https://www.acmicpc.net/problem/3052



본인이 제출한 답

const fs = require("fs");
const [...arr] = (process.platform === "linux"
  ? fs.readFileSync("/dev/stdin").toString()
  : `42
84
252
420
840
126
42
84
420
126
`
)
  .trim()
  .split("\n");

let inputLines = [];
let arrLines = arr.map((element) => element.split(" "));

arrLines.forEach((arrLines) => {
  inputLines.push(arrLines.map((e) => Number(e)));
});

let aArray = [];

for (let i = 0; i < inputLines.length; i++) {
  let LNum = inputLines[i][0] % 42;
  aArray.push(LNum);
}

aArray.sort((a, b) => a - b);

for (let j = 0; j < aArray.length; j++) {
  while (aArray[j] === aArray[j + 1]) {
    aArray.splice(j, 1);
  }
}

console.log(aArray.length);

풀이과정 소감

  • 문제를 바로 이해하기 힘들었고 로직을 너무 복잡하게 짰다.
    먼저 모든 배열의 수를 % 12 로 나온 나머지 결과값들의 배열을 다시 버블정렬로 정리하고 그렇게 정리한 배열안에 인접한 숫자들끼리 대조해서 같은 수가 더 이상 안나올 때까지 splice()로 삭제한 배열의 길이값을 출력하는 방법을 썼다.

  • 하지만 앞으로 더 한 알고리즘의 난제가 많을지도 모르는데 (입출력 코드를 제외하고) for문을 2번에 sort()까지 써야만 푸는 건 좋은 방법이 아니라 생각해 다른 문제풀이법도 보았다.

let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');

const userNum = [];

input.forEach(x => {
     const num = x % 42;
    
    if (userNum.indexOf(num) === -1) {
        userNum.push(num);
    }
});

console.log(userNum.length);

풀이 출처 https://gurtn.tistory.com/44

  • forEach와 indexOf()의 조합으로 코드가 적으면서도 깔끔하다. indexOf()찾을려는 해당 배열의 요소가 없으면 -1을 반환해 주는데 그것을 일치 비교연산자와 대조해 조건문이 성립하게 만드는 마법같은 효과를 보여준다.

  • 개인적으로 이 문제에서 많이 고생했고 배열 고차 함수를 잘 다루기 위한 연습의 필요성을 많이 느꼈다. 그냥저냥 아는 개념과 실제 적용하는 상황은 역시나 다르기 때문이다.....

profile
어떤 문제든 파악 할 수 있으며 해결책을 찾을 수 있는 개발능력을 꿈꾸고 있습니다.

0개의 댓글