[백준 | Javascript] 1676

박기영·2022년 9월 7일
0

백준

목록 보기
112/127
post-custom-banner

알고리즘 기초 1/2. 300 - 수학1
1676번. 팩토리얼 0의 개수

문제

1676번 문제 링크

solution

const fs = require("fs");
let input = Number(fs.readFileSync("/dev/stdin").toString().trim());

function factorial(num){
    if(num === 0 || num === 1){
        // BigInt 타입 처리를 위해 숫자 뒤에 n을 붙여준다.
        return 1n;
    }
    
    return BigInt(num) * factorial(num -1);
}

let result = factorial(input);

let resultArr = String(result).split("");

// 0의 개수를 세기 위한 count
let count = 0;

while(true){
    let popedNum = resultArr.pop();
    
    // result 배열에서 pop한 값이 0이라면 count를 증가시키고 다음 pop을 진행
    if(popedNum === "0"){
        count++;
        
        continue;
    }
    
    // result 배열에서 pop한 값이 0이 아니라면 while문을 종료한다
    break;
}

console.log(count);

문제는 없지만 오답인 풀이

const fs = require("fs");
let input = Number(fs.readFileSync("/dev/stdin").toString().trim());

function factorial(num){
    if(num === 0 || num === 1){
        return 1;
    }
    
    return num * factorial(num -1);
}

let result = factorial(input);

let resultArr = String(result).split("");

// 0의 개수를 세기 위한 count
let count = 0;

while(true){
    let popedNum = resultArr.pop();
    
    // result 배열에서 pop한 값이 0이라면 count를 증가시키고 다음 pop을 진행
    if(popedNum === "0"){
        count++;
        
        continue;
    }
    
    // result 배열에서 pop한 값이 0이 아니라면 while문을 종료한다
    break;
}

console.log(count);

문제 자체는 어렵지않다.
그치만, 그냥 풀면 코드 상 틀린게 없는데도 오답이 된다.
한 끗 차이로 오답이 발생하는데 그 이유는 바로
BigInt이다.

팩토리얼 연산에 큰 수가 입력되었을 때 결과값이 number 타입으로 처리 가능한 범위를 넘어선다.
그래서 문제가 발생하는 것이다.
그래서 입력되는 숫자를 BigInt 타입으로 바꿔주면 해결된다!

참고 자료

참고 자료 1

profile
나를 믿는 사람들을, 실망시키지 않도록
post-custom-banner

0개의 댓글