본문 바로가기
개발/알고리즘

[프로그래머스][LEVEL3] 멀리 뛰기

by ISA(류) 2021. 12. 24.

# 문제 원문

효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 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]
}
반응형