-
[프로그래머스] 멀리 뛰기 javascriptFrontend/Algorithm 2022. 6. 17. 15:17
문제 설명
효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 1칸, 또는 2칸을 뛸 수 있습니다. 칸이 총 4개 있을 때, 효진이는
제한 사항
(1칸, 1칸, 1칸, 1칸)
(1칸, 2칸, 1칸)
(1칸, 1칸, 2칸)
(2칸, 1칸, 1칸)
(2칸, 2칸)
의 5가지 방법으로 맨 끝 칸에 도달할 수 있습니다. 멀리뛰기에 사용될 칸의 수 n이 주어질 때, 효진이가 끝에 도달하는 방법이 몇 가지인지 알아내, 여기에 1234567를 나눈 나머지를 리턴하는 함수, solution을 완성하세요. 예를 들어 4가 입력된다면, 5를 return하면 됩니다.- n은 1 이상, 2000 이하인 정수입니다.
nresultn result 4 5 3 3 입출력 예 #1
위에서 설명한 내용과 같습니다.입출력 예 #2
(2칸, 1칸)
(1칸, 2칸)
(1칸, 1칸, 1칸)
총 3가지 방법으로 멀리 뛸 수 있습니다.✍️ 나의 풀이방식 (🚨 콜스택 오버플로우)
function solution(n) { let arr = [0, 1, 2]; for(let i = 3; i <= n; i++) { arr.push(arr[i - 1] + arr[i - 2]); } return arr[n] % 1234567; }
이 문제는 피보나치 수열과 비슷한데,
1칸을 갈 때 뛰는 방법은 1가지, 2칸을 갈 때 뛰는 방법은 2가지가 존재한다.
3칸을 갈 때는 (2칸에서 + 1칸 뛰기) + (1칸에서 + 2칸 뛰기)의 방법을 적용하면,
1칸 갈 때 뛰는 방법의 경우의 수 + 2칸 갈 때 뛰는 방법의 경우의 수 = 3칸을 가는 경우의 수가 된다.
그러나 위처럼 재귀를 사용했을 때 너무 많은 호출이 이뤄질 경우, 콜스택 오버플로우가 발생한다.
✍️ 다른 사람의 풀이방식
1. BigInt를 써서 풀기
function solution(n) { let arr = [0n, 1n, 2n]; for(let i = 3; i <= n; i++) { arr.push(arr[i - 1] + arr[i - 2]); } return arr[n] % 1234567n; }
BigInt는 Number 원시 값이 안정적으로 나타낼 수 있는 최대 값인 2^53 - 1 보다 큰 정수를 표현할 수 있는 내장 객체다.
정수 리터럴 뒤에 n을 붙이거나 BigInt()를 호출해 생성할 수 있다.
2. forEach를 사용해서 연산하기
function solution(n) { if (n < 2) return 1; const count = [0, 1, 2, ...Array(n - 2).fill(0)]; count.forEach((_, i) => { if (i > 2) count[i] = (count[i - 2] + count[i - 1]) % 1234567; }); return count[n]; }
참고자료
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/BigInt
반응형'Frontend > Algorithm' 카테고리의 다른 글
[프로그래머스] 튜플 javascript (0) 2022.06.23 [프로그래머스] 삼총사 javascript (0) 2022.06.21 [프로그래머스] 신고 결과 받기 javascript (0) 2022.04.12 [프로그래머스] 신규 아이디 추천 javascript (0) 2022.04.08 [프로그래머스] 완주하지 못한 선수 javascript (0) 2022.04.04