Algorithm | Code Kata #17

Wook·2021년 12월 23일
0

Algorithm | Code Kata

목록 보기
17/21

문제

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


문제 접근 / 정리 / 아이디어들

  1. 뒤쪽으로 갈수록 미래의 경우이다.
  2. 배열을 역순으로 뒤집어 이중 for문을 활용하여 빼준다.
  3. 가장 큰 값을 찾는다.

풀이 코드

(1)

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]);

(2)

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]))

(3)

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중 반복문을 통해 쉽게 값을 구할 수 있었다. 더 다양한 풀이를 찾아보고 더 효율이 좋은 코드를 찾아보며 정답을 푼 것에 만족하지 않고 더 좋은 풀이 방법을 연구하며 공부해야겠다.

profile
지속적으로 성장하고 발전하는 진취적인 태도를 가진 개발자의 삶을 추구합니다.

0개의 댓글