# 문제 원문
효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 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 이하인 정수입니다.
입출력 예
n / result
4 | 5 |
3 | 3 |
# 문제 풀이
입력 받은 n의 길이 만큼 1,2의 수를 조합 해서 만들수 있는 경우의 수는 피보나치 수열의 형태를 가진다. 1과 2 2가지의 조합의 합이 모든 방법의 합이라는 간단한 원리이다. 고로 arr[n] = arr[n -1] + arr[n + 2]를 구해주면 된다. 다만 오버플로우가 발생할 만큼 큰 n이 테스트 케이스에 포함 되어 있으므로 지문에서 요구하는 1234567의 나머지로 오버플로우를 방지하는 방법만 신경써주면 된다.
# 솔루션 플로우
1. 입력 받은 n이 1일 경우 1을 반환해준다.(배열 길이가 음수가 될 수 없어서 얼리리턴 처리함)
2. 입력 받은 n - 2만큼 반복을 한다.
3. result 배열의 경우 [0, 1, 2]부터 시작하므로 idx역시 3부터 시작한다.
4. result[idx] = (result[idx - 1] + result[idx - 2]) % 1234567을 구한다.
5. 얻어진 result의 n번째 답을 반환한다.
1. FP
function solution(n) {
if(n === 1) return 1;
return new Array(n - 2).fill(true)
.reduce((result, _, idx) => {
idx += 3;
result[idx] = (result[idx - 1] + result[idx - 2]) % 1234567;
return result;
}, [0, 1, 2])[n]
}
'개발 > 알고리즘' 카테고리의 다른 글
[프로그래머스][LEVEL3] 줄 서는 방법 (0) | 2022.01.03 |
---|---|
[프로그래머스][LEVEL3] 최고의 집합 (0) | 2021.12.29 |
[프로그래머스][LEVEL3] 야근지수 (0) | 2021.12.20 |
[프로그래머스][LEVEL3] 거스름돈 (0) | 2021.12.09 |
[프로그래머스][LEVEL3] 하노이의 탑 (0) | 2021.11.25 |