본문 바로가기
프로그래머스

멀리 뛰기 (C#)

by LemongO 2024. 5. 9.

📌문제 설명

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

📌입출력 예 설명

입출력 예 #1
위에서 설명한 내용과 같습니다.
입출력 예 #2
(2칸, 1칸)
(1칸, 2칸)
(1칸, 1칸, 1칸)
총 3가지 방법으로 멀리 뛸 수 있습니다.

🔍피보나치 수열

이번 문제를 풀기위해 사용되는 정의이다.

먼저 점화식을 만들면

  • 1칸일 때 F(0) = 1 [1]
  • 2칸일 때 F(1) = 2 [1, 1], [2]
  • F(n) = F(n-1) + F(n-2)
    위 식을 사용해 (n - 1)칸일 때의 방법을 피보나치 수열로 구할 수 있다.

💡풀이

위 식을 적용하기 n개 만큼 배열을 만들어 둔다.
long[] cases = new long[n];

n이 1일 때 바로 1을 return 한다.

if (n == 1)
    return 1;

1칸 F(0)과 2칸 F(1)의 개수를 만든다.

cases[0] = 1;
cases[1] = 2;   

구한 방법에 1234567을 나눈 나머지를 F(i)으로 할당하고 n까지 for문을 돌며 피보나치 수열을 적용한다.

for(int i = 2; i < n; i++)
    cases[i] = (cases[i - 2] + cases[i - 1]) % 1234567;    

n칸의 방법이 F(n - 1)이므로 cases[n-1] 을 반환한다.
return cases[n - 1];

전체코드

public long 멀리뛰기(int n)
{
    long[] cases = new long[n];

    if (n == 1)
        return 1;

    cases[0] = 1;
    cases[1] = 2;            

    for(int i = 2; i < n; i++)
        cases[i] = (cases[i - 2] + cases[i - 1]) % 1234567;

    return cases[n - 1];
}

피보나치 수열을 써야 하는지 몰랐다.
여러 케이스들을 확인하고 어떤 방식을 적용하는지 빠르게 이해 하는게 중요한 듯 하다.
그리고 해당 방식의 공식(?)을 알아두는 것도 좋아 보인다.

'프로그래머스' 카테고리의 다른 글

n개 간격의 원소들 (C#)  (0) 2024.05.20
괄호 회전하기 (C#)  (0) 2024.05.15
귤 고르기 (C#)  (0) 2024.05.09
예상 대진표 (C#)  (0) 2024.05.09
N개의 최소공배수 (C#)  (0) 2024.05.09