오늘의 학습 키워드
</> 동적계획법
공부한 내용 본인의 언어로 정리하기
class Solution {
public int minCostClimbingStairs(int[] cost) {
int n = cost.length;
// 최소 비용을 저장할 dp 배열
int[] dp = new int[n + 1];
// 초기 값 설정: 첫 번째와 두 번째 계단에 도달하는 비용은 각각 cost[0], cost[1]
dp[0] = 0; // 0번째 계단에 서있는 비용은 0
dp[1] = 0; // 1번째 계단에 서있는 비용도 0
// 각 계단에 도달하는 최소 비용 계산
for (int i = 2; i <= n; i++) {
dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
}
// 최종적으로, dp[n]이 목적지인 계단에 도달하기 위한 최소 비용을 의미
return dp[n];
}
}
오늘의 회고
오늘 문제는 계단이 있고, 각 계단마다 그 계단에 오르기 위해 지불해야 하는 비용 cost[i]
가 주어진다.
계단은 첫 번째 또는 두 번째 계단에서 시작할 수 있고 한번에 한 계단 또는 두 계단을 올라갈 수 있다.
최종 반환해야할 결과는 맨 꼭대기에 도달할 때 까지 최소한으로 지불해야할 비용을 구하는 것이다.
오늘 문제는 유형을 따라 동적 계획법을 이용하여 풀이를 하였다.
dp[i]
를 i
번째 계단에 도달하는 데 드는 최소 비용으로 정의하고 비용의 이전 계단 또는 두 계단 전으로 볼 수 있다.
그리고 이 두 값을 비교하여 더 적용 비용을 선택해서 현재 계단의 비용을 더하는 방식이다.
우선 총 계단의 수를 정의해줬다
int n = cost.length;
그리고 각 계단에 도달하는 최소 비용을 저장한다.
그리고 범위초과를 방지하기 위해 배열의 범위를 n+1로 설정해주었다.
int[]dp = new int[n+1];
초기값으로 계단의 시작 비용을 0으로 초기화한다.
dp[0] = 0;
dp[1] = 0;
중요한 각 계단에 도달하는 최소 비용을 계산한다. 한 계단 또는 두 계단을 오를 수 있으므로 두 가지 다 비교해서 낮은 값을 구한다.
for (int i = 2; i <= n; i++) {
dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
}
최종적으로 계단의 꼭대기에 도달할 때 까지의 최소 비용을 반환한다.
return dp[n];
AI 코드리뷰
현재 코드의 장점
현재 코드의 단점
시간 복잡도
class Solution {
public int minCostClimbingStairs(int[] cost) {
int n = cost.length;
int first = 0, second = 0;
for (int i = 2; i <= n; i++) {
int current = Math.min(first + cost[i-2], second + cost[i-1]);
first = second;
second = current;
}
return second;
}
}
개선된 코드의 장점
개선된 코드의 단점
시간 복잡도
이 개선된 버전은 원래 솔루션의 로직을 유지하면서 공간 효율성을 크게 향상시켰습니다. 큰 입력값에 대해 더 효율적으로 작동할 것입니다.
내일 공부할 것 :
동적계획법 복습
문제