2025년 01월 18일

2025. 1. 18 알고리즘 오답노트

알고리즘

1. 소수 찾기 (백준 1978번)

링크
너무 돌려서 생각한 것 같다. 이상한 방식으로 삽질하다가 제일 안정적인 방식을 놓쳐버렸다.
소수 중에서 10 미만의 소수로 나누어서, 나머지가 0이 아닌 경우을 찾으려 했는데 예외 케이스가 너무 많았다. (틀린 방법)

내 답안

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

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

let init = [1, 2, 3, 5, 7];
let count = 0;

for (let i = 0; i < N; i++) {
    const k = arr[i];
    if (k === 1) continue;
    if (init.includes(k)) count += 1;
    if (k % 2 !== 0 && k % 3 !== 0 && k % 5 !== 0 && k % 7 !== 0) count += 1;
}

console.log(count);

고친 답안

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

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

let count = 0;

arr.forEach((n) => {
    if (n === 1) return;
    let result = true;
    for (let i = 2; i < n; i++) {
        if (n % i === 0) {
            result = false;
            break;
        }
    }
    if (result) count += 1;
});

console.log(count);

2. 분해합 (백준 2231번)

링크
자릿수를 구하는 게 좀 어려웠다. 알고리즘 몇몇을 찾아보니 수학적으로 접근하여 풀던데, 난 그냥 귀찮아서 문자열로 파싱하고 각 자릿수를 map 함수를 통해 정수화 했다.

내 답안 (정답)

const N = Number(`216`);

let result = 0;

for (let i = 1; i < N; i++) {
    const sum = i
        .toString()
        .split("")
        .map(Number)
        .reduce((p, c) => p + c);

    if (sum + i === N) {
        result = i;
        break;
    }
}

console.log(result);