티스토리 뷰
Algorithm/LeetCode
[LeetCode - Daily Challenge] 309. Best Time to Buy and Sell Stock with Cooldown
Jaime.Lee 2021. 10. 18. 10:30Problem
You are given an array prices where prices[i] is the price of a given stock on the ith day.
Find the maximum profit you can achieve. You may complete as many transactions as you like (i.e., buy one and sell one
share of the stock multiple times) with the following restrictions:
After you sell your stock, you cannot buy stock on the next day (i.e., cooldown one day). Note: You may not engage in
multiple transactions simultaneously (i.e., you must sell the stock before you buy again).
Example 1:
Input: prices = [1,2,3,0,2]
Output: 3
Explanation: transactions = [buy, sell, cooldown, buy, sell]
Example 2:
Input: prices = [1]
Output: 0
Constraints:
- 1 <= prices.length <= 5000
- 0 <= prices[i] <= 1000
Solution
주식의 날짜별 가격이 배열ㄹ로 주어질 때 최대 이윤을 반환하는 문제입니다.
주식을 사고, 팔고, 휴식을 할 수 있는데 팔았을 경우 다음 날은 주식을 구매할 수 없습니다.
주식을 샀을 때와 팔았을 때의 변수와, 그 변수들의 이전 값들을 각각 선언하여 DP 방식으로 풀 수 있습니다.
public class Solution {
public int maxProfit(int[] prices) {
if (prices == null || prices.length == 0) {
return 0;
}
int sell = 0, previousSell = 0, buy = Integer.MIN_VALUE, previousBuy;
for (int price : prices) {
previousBuy = buy; // (1)
buy = Math.max(previousSell - price, previousBuy); // (2)
previousSell = sell; // (3)
sell = Math.max(previousBuy + price, previousSell); // (4)
}
return sell;
}
}
- 이전 구매 내역에 마지막 구매 내역을 저장합니다.
- 이전에 팔고 현재 구매한 경우와, 이전에 구매한 경우를 비교해 더 높은 값을 저장합니다.
- 이전 판매 내역에 마지막 판매 내역을 저장합니다.
- 이전에 사고 현재 판 경우와 이전에 팔고 휴식한 경우를 비교해 더 높은 값을 저장합니다.
Test
package io.lcalmsky.leetcode.best_time_to_buy_and_sell_stock_with_cooldown;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
class SolutionTest {
@Test
void givenArray_whenBuyAndSellStockWithCooldown_thenGetMaximumProfit() {
assertAll(
() -> test(new int[]{1, 2, 3, 0, 2}, 3),
() -> test(new int[]{1}, 0)
);
}
private void test(int[] given, int expected) {
// when
Solution solution = new Solution();
int actual = solution.maxProfit(given);
// then
assertEquals(expected, actual);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
[LeetCode - Daily Challenge] 496. Next Greater Element I (0) | 2021.10.21 |
---|---|
[LeetCode - Daily Challenge] 993. Cousins in Binary Tree (0) | 2021.10.20 |
[LeetCode - Daily Challenge] 279. Perfect Squares (0) | 2021.10.17 |
[LeetCode - Daily Challenge] 1008. Construct Binary Search Tree from Preorder Traversal (0) | 2021.10.16 |
[LeetCode - Daily Challenge] 543. Diameter of Binary Tree (0) | 2021.10.15 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 함께 자라기
- proto3
- JPA
- 스프링 부트 애플리케이션
- 스프링부트
- 스프링 부트 회원 가입
- 알고리즘
- leetcode
- @ManyToOne
- Linux
- r
- 스프링 부트
- 함께 자라기 후기
- Java
- Spring Data JPA
- Jackson
- Spring Boot JPA
- gRPC
- spring boot app
- 헥사고날 아키텍처
- spring boot application
- 스프링 데이터 jpa
- 스프링 부트 튜토리얼
- JSON
- Spring Boot
- intellij
- Spring Boot Tutorial
- spring boot jwt
- 클린 아키텍처
- QueryDSL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함