본문 바로가기

공부/TIL

[TIL] 24.06.12 백준 1676번 js

반응형

내가 푼 문제 📖

 

내가 작성한 코드 💻

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

let cnt = 0;

for(let i=1; i<=input; i++){
  let num = i;

  while(num % 5 === 0){
    cnt++
    num /= 5
  }
}

console.log(cnt)

 

어려웠던 점

1. 팩토리얼 범위

const factorial = (n) => {
  if(n == 0) return 0;
  if(n == 1) return 1;

  return n * factorial(n-1)
}

 

팩토리얼로 값을 구하고 뒤에서부터 0의 개수를 세는 방법을 생각하고 계산을 했었는데 주어진 N값의 범위가 (0~500) 22 팩토리얼만 돼도 값이 (1.1240007277776077e+21) 숫자가 터무니없이 커진다 ㅡㅡ;; 

N! 팩토리얼 0의 개수를 구하기도 전에 팩토리얼에 대한 값조차 구하지 못했다. 그래서 어떻게 풀어야 될까에 대한 고민을 정말 많이 했다. 

 

고민의 흔적

깨달은 점 

1. 수학적 사고

직접 계산해서 푸는 문제는 아니라고 생각했다. 그래서 수학적 사고라는 것을 해봤다!!^^

while(num % 5 === 0){
  cnt++
  num /= 5
}


뒤에서부터 0의 개수를 구하는 문제이기 때문에 0이 나온다는 건 10으로 나누어 떨어진다는 말! 팩토리얼은 결국 모두 곱하는 과정이기 때문에 10 = 2 x 5, 2와 5를 가지고 10을 만들 수 있다! 그래서 2와 5의 개수를 구하면 되지만 2의 개수는 구할 필요가 없다. 쉽게 생각해 봐도 2의 개수가 훨씬 많기 때문에 5의 개수만을 구해서 정답을 구할 수 있었다.

 

 

회고 🧐

수학적 사고를 키우자!


반응형

'공부 > TIL' 카테고리의 다른 글

[TIL] 24.07.15  (0) 2024.07.15
[TIL] 24.07.09 백준 10844번 js  (0) 2024.07.09
[TIL] 24.07.08  (0) 2024.07.08
[TIL] 24.06.17 백준 1373번 js  (0) 2024.06.17
[TIL] 24.06.11 백준 6588번 js  (0) 2024.06.11
[TIL] 24.06.10 React 트랙을 신청한 이유  (0) 2024.06.10
[TIL] 24.06.03 백준 10820번 JS  (0) 2024.06.03
[TIL] 24.05.28 백준 1935번 JS  (0) 2024.05.28