[문제 링크]
int 배열 prices가 주어지고, prices[i]는 i번째 날의 주식 가격
i번째 날에 샀다면 i + 1 이후에만 팔 수 있음
얻을 수 있는 최고 이익을 반환 (판매 가격 - 구입 가격)
수익을 낼 수 없는 배열이라면 0을 반환
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(prices) {
const len = prices.length;
let profit = 0;
let min = prices[0];
for (let i = 1; i < len; i++) {
if (prices[i] < min)
min = prices[i];
else if (prices[i] - min > profit)
profit = prices[i] - min;
}
return profit;
};
배열을 전부 돌면서 현재의 값과 지금까지의 최저값을 비교
더 작다면 지금 가격을 min으로 변경
그렇지 않다면 수익을 낼 수 있는 구조이므로 둘의 차를 구함
그게 지금까지 최고 수익보다 크다면 변경
배열을 다 돌고나면 뽑을 수 있는 최대 이익 완성
그렇지 않은 경우 초기값 0 반환
Accepted
Runtime 72ms (Beats 94.91%)
Memory 51.5MB (Beats 80.25%)
사실 이번에도 꽤나 애를 먹어서 결과적으로 작성한 코드는 완전한 내 것이 아니다. 감은 대충 잡았지만 초기에 몇 번 작성한 코드는 전부 긴 배열에서 타임 아웃이 났다. (1 <= prices.length <= 10^5) 그러다가 자포자기 심정으로 몇몇개의 코드를 보게 되었는데, 간단한 방법을 바로 찾을 수 있어서 놀랐다. 나는 처음에 min 값만 구하는 것이 아닌 max 값도 함께 구하는 방식만 생각해서 for문이 2중이거나 두 개가 필요하다거나 했는데 사실은 최저값을 찾아가면서 매번 최저값을 가진 인덱스 이후랑만 계산해주면 되는 것이었다. 막연히 머리로만 그려보니 배열에서 최저값을 구했는데 사실 두 값의 차가 최대인 것이 최저값의 위치 이전에 있다면 어떻게 하지?라고 생각했었는데 현재까지의 최저값과 모든 수의 차이를 구하기 때문에 걱정할 일이 없었다. 내 방식으로 답에 도달하지 못할 때는 잠시 내려두고 다른 방식으로 접근해보자!