문제 링크
풀이
const [n, k] = require("fs").readFileSync("/dev/stdin").toString().trim().split(" ").map(v => +v);
const arr = [];
for (let i=2; i<=n; i++) arr.push(i);
let count = 0;
let prime;
let nth;
while (count < k) {
prime = arr[0];
arr.some(v => {
if (v % prime === 0) {
arr.splice(arr.indexOf(v), 1);
nth = v
count++;
}
if (count === k) return true;
});
}
console.log(nth);
2부터 n까지 수 중에서 가장 작은 수로 나누어 떨어지는 수를 모두 지우기를 반복하면서 그 횟수가 k와 같아질 때 지운 수를 nth에 저장한다.
forEach 대신 some을 사용한 이유는 count가 k에 도달했을 때 반복을 빠져나가야 하는데, forEach문으로는 까다롭기 때문이다. Array.prototype.some은 콜백 함수의 반환값이 단 한 번만이라도 참이면 true를 반환하는데, 이 말은 즉 콜백 함수의 반환값이 true라면 그 즉시 순회를 멈추고 true를 반환한다는 뜻이다. 따라서, 콜백 함수에서 count가 k와 동일할 때 true를 반환하도록 하면 그 즉시 반복을 멈추고 빠져나가게 된다.
'연습장 > 백준(BOJ) 문제풀이' 카테고리의 다른 글
[백준 10825] 국영수 with Node.js (0) | 2021.04.20 |
---|---|
[백준 2606] 바이러스 with Python (0) | 2021.04.20 |
[백준 4949] 균형잡힌 세상 with Node.js (0) | 2021.04.17 |
[백준 1764] 듣보잡 with Node.js (0) | 2021.04.16 |
[백준 11399] ATM with Python (0) | 2021.04.16 |