2025년 01월 26일

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

알고리즘

1. 팩토리얼 0의 개수 (백준 1676번)

링크
설계가 잘못된 것 같다. 처음엔 짝수 갯수와 5의 배수를 구하고, 이 둘을 곱한 다음 0의 개수를 구하는 방식으로 풀었다가, 계속 안맞는 부분이 있어서 여러 번 코드를 수정해봐도 이상한 답만 나왔다.
결국 맞는지는 잘 모르겠지만, 여러 질문 게시글들을 보고 접근 방식을 바꿔서 풀어보았다.

  1. 주어진 N을 1부터 순회하며 5의 배수를 찾는다.
  2. 5의 배수를 5로 나누었을 때 나머지가 0이 안나올 때 까지 5의 배수에 5를 나눈다.
  3. 총 나눈 횟수를 출력한다.

팩토리얼 0의 개수 문제풀이

내 답안

const fs = require("fs");

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

const N = Number(input);

const a = Array.from({ length: N }, (_, i) => i + 1).filter(
    (i) => i % 2 === 0 && i % 5 !== 0 && i % 10 !== 0
);

const b = Array.from({ length: N }, (_, i) => i + 1).filter((i) => i % 5 === 0);

let count = 0;

for (let i = 0; i < b.length; i++) {
    let sum = a[i] * b[i];
    while (true) {
        sum /= 10;
        count += 1;
        if (sum % 10 !== 0) break;
    }
}

console.log(count);

고친 답안(정답)

const fs = require("fs");

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

const N = Number(input);

let count = 0;

for (let i = 1; i <= N; i++) {
    let temp = i;
    while (temp % 5 === 0) {
        temp /= 5;
        count++;
    }
}

console.log(count);