prices는 배열이며, 각 요소는 매일의 주식 가격입니다. 만약 한 번만 거래할 수 있다면 = 사고 팔 수 있다면, 제일 큰 이익은 얼마일까요?
Input: [7,1,5,3,6,4]
Output: 5
설명:
2일(가격=1)에 샀다가 5일(가격=6)에 사는 것이 6-1이라 제일 큰 수익 7-1=6 은 안 되는거 아시죠? 먼저 사야 팔 수 있습니다.
Input: [7,6,4,3,1]
Output: 0
설명:
여기서는 매일 가격이 낮아지기 때문에 거래가 없습니다. 그래서 0
- 뒤쪽으로 갈수록 미래의 경우이다.
- 배열을 역순으로 뒤집어 이중 for문을 활용하여 빼준다.
- 가장 큰 값을 찾는다.
const maxProfit = prices => {
let reverse = prices.reverse() // 인자 배열 reverese
let returnValue = 0; // 최종 리턴 최댓값 ( 없을 경우 0 )
for (let i=0; i<reverse.length; i++)
{
for (let j=i+1; j<reverse.length; j++)
{
returnValue = Math.max(returnValue,reverse[i]-reverse[j])
}
console.log(returnValue)
}
return returnValue;
};
maxProfit([7,1,5,3,6,4]);
const maxProfit = prices => {
//산값(작은수)
let buy = 0;
//판값(큰수)
let sell = 0;
//최대 비교값
let max = 0;
for(let i = 0; i < prices.length; i++){
//최대이윤은 판날에서 산날을 뺀다
const profit = prices[sell] - prices[buy]
//프로핏이 0보다 작으면 산값은 판값이 되는거고
if(profit < 0){
buy = sell;
}
//최대값이(차익) 이윤보다 작으면 최대값이 이윤이랑 같아진다
if(max < profit){
max = profit;
}
//for문을 돌리면서 파는 값을 키우면서 비교
sell++;
}
return max;
};
console.log(maxProfit([7,1,5,3,6,4]))
const maxProfit = (prices) => {
let num = 0;
let numMax = Math.max(...prices); // 배열에서 최고값
let numMin = Math.min(...prices); // 배열에서 최소값
let maxIndex = prices.indexOf(numMax); // 최고값의 index
if (maxIndex === 0) {
// 최고값의 index = 0 이면, 배열 첫번째 값 삭제 후 다시 최고값과 index 찾음
prices.shift();
numMax = Math.max(...prices);
maxIndex = prices.indexOf(numMax);
}
let minIndex = prices.indexOf(numMin); // 최소값의 index
if (maxIndex > minIndex) {
// index 값 비교(최고값의 index가 최소값의 index보다 뒤에 있으면 뺄셈)
num = numMax - numMin;
return num;
} else {
return num;
}
};
최근에 풀었던 문제와 마찬가지로
2중 반복문
을 통해 쉽게 값을 구할 수 있었다. 더 다양한 풀이를 찾아보고 더 효율이 좋은 코드를 찾아보며 정답을 푼 것에 만족하지 않고 더 좋은 풀이 방법을 연구하며 공부해야겠다.