JavaScript 백준 온라인 알고리즘 공부
백준 3052 번 JavaScript 문제
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을 반환해 주는데
그것을 일치 비교연산자와 대조해 조건문이 성립하게 만드는 마법같은 효과를 보여준다.
개인적으로 이 문제에서 많이 고생했고 배열 고차 함수를 잘 다루기 위한 연습의 필요성을 많이 느꼈다. 그냥저냥 아는 개념과 실제 적용하는 상황은 역시나 다르기 때문이다.....