Algorithm Solving/Java

[programmers] Java Lv.2 - 멀리 뛰기

기만나🐸 2025. 1. 8. 10:31

https://school.programmers.co.kr/learn/courses/30/lessons/12914

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명
효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 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 이하인 정수입니다.


입출력 예


입출력 예 설명
입출력 예 #1
위에서 설명한 내용과 같습니다.

입출력 예 #2
(2칸, 1칸)
(1칸, 2칸)
(1칸, 1칸, 1칸)
총 3가지 방법으로 멀리 뛸 수 있습니다.

 

풀이

 

유의사항

1234567를 나눈 나머지를 리턴하는 함수이므로 dp 메서드 안에서 다음과 같이 계산해야한다.

memo[n] = ((dp(n-1)%1234567) + (dp(n-2)%1234567)) % 1234567;

처음에 dp(n) % 1234567 로 제출했다가 틀렸다,,ㅎ

dp(n-1)과 dp(n-2)에 대해서도 1234567로 나눈 나머지 값을 저장해야하기 때문에, dp 메서드 안에서 계산해줘야한다.

 

n=3인 경우에도 return 3이 되도록 if문을 작성했었는데,

dp(3) = dp(2) + dp(1) 이므로 3에 대한 종료조건은 필요하지 않아 삭제했다.

((근데 제출은 if (n==3) 조건도 포함해서 해버렸다,,🥲))

 

import java.io.*;

public class Main {
    public static long[] memo;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        memo = new long[n+1];
        System.out.println(dp(n));

    }
    public static long dp(int n) {
        if (memo[n] != 0) {
            System.out.print("이미 계산된 n=" + n + "\t");
            System.out.println("memo["+ n +"]=" + memo[n]);
            return memo[n];
        }

        if (n == 1) {
            memo[n] = 1;
            System.out.println("n=" + n + "\tmemo["+ n +"]=" + memo[n]);
            return memo[n];
        }
        if (n == 2) {
            memo[n] = 2;
            System.out.println("n=" + n + "\tmemo["+ n +"]=" + memo[n]);
            return memo[n];
        }

        System.out.println("memo[" + n + "] = dp(" + n + "-1) + dp(" + n + "-2)");
        memo[n] = ((dp(n-1)%1234567) + (dp(n-2)%1234567)) % 1234567;
        System.out.print("memo[" + n + "] = dp(" + (n-1) + ") + dp(" + (n-2) + ") = ");
        System.out.println(memo[n-1] + " + " + memo[n-2] + " = " + memo[n]);
        return memo[n];
    }
}

 

제출

class Solution {
    public static long[] memo;
    public long solution(int n) {
        long answer = 0;
        memo = new long[n+1];
        answer = dp(n);
        return answer;
    }
    public static long dp(int n) {
        if (memo[n] != 0) {
            return memo[n];
        }

        if (n == 1) {
            memo[n] = 1;
            return memo[n];
        }
        if (n == 2) {
            memo[n] = 2;
            return memo[n];
        }
        
        memo[n] = ((dp(n-1)%1234567) + (dp(n-2)%1234567)) % 1234567;
        return memo[n];
    }
}