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];
}
}
'Algorithm Solving > Java' 카테고리의 다른 글
[programmers] Java Lv.2 - 괄호 회전하기 (0) | 2025.01.10 |
---|---|
[programmers] Java Lv.2 - 귤 고르기 (0) | 2025.01.09 |
[programmers] Java Lv.2 - N개의 최소공배수 (1) | 2025.01.07 |
[programmers] Java Lv.2 - 예상 대진표 (0) | 2025.01.06 |
[programmers] Java Lv.2 - 카펫 (0) | 2025.01.03 |