알고리즘 문제 풀기(프로그래머스)
https://github.com/hoinlee-moi/Algorithm
JS기본문법 다시 공부
https://github.com/hoinlee-moi/ModernJS
React 강의 듣기
https://github.com/hoinlee-moi/React_prac
슬슬 알고리즘의 난이도가 어렵긴 하다.. 리액트 강의는 재밋어지고 한쪽이 재밋어지니 한쪽이 어려워지는 현상!
오늘알고리즘
피보나치 수 - https://school.programmers.co.kr/learn/courses/30/lessons/12945#
function solution(n) {
let f0 = BigInt(0)
let f1 = BigInt(1)
let fn = BigInt(0)
for(let i=2; i<=n;i++) {
fn = f0 + f1
f0=f1
f1=fn
}
return fn%BigInt(1234567);
}
일단 이렇게 진행을 했다. 맨 처음은 재귀함수를 통해 진행했지만 숫자가 조금만 커져도 엄청나게 잡아먹는 시간과 메모리 때문에 반복문을 이용해 봤다.
하지만 반복문을 할 때도 계속 답이 다르게 나와 왜 그런가 봤더니 피보나치의 수 는 20정도만 돼도 4자리 수가 나오는데 제한 조건이 100000까지이니 엄청난 자릿수 나올거라 생각한다.
그래서 2가지의 방법이 있었는데 먼저 BigInt
를 이용해 자릿수를 크게 만들어주니 괜찮아졌다.
그리고 다른 방법은 계산마다 나눗셈을 진행시키는 건데 그러면 훨씬 좋아지긴 한다.
먼저 앞서 재귀 함수를 이용했을 때 만든 함수이다.
function fibonacci(num) {
if (num === 1 || num === 2) {
return 1
}
return fibonacci(num-1) + fibonacci(num-2)
}
function solution(n) {
let result = [0 , 1];
while ( result.length !== n + 1) {
let fibonacci = (result[result.length - 2] + result[result.length - 1]) % 1234567
result.push(fibonacci);
}
return result[n];
}
위의 코드는 BigInt를 이용한 것이 아닌 계산 마다 1234567의 나머지 계산을 하여 자릿수를 줄였다.
매번 풀어보다 간혹 등장하는 시간적 효율이나 메모리 등을 신경쓰는 단계까지 와야하는 것 같다.