TIL 61 day 알고리즘/코딩테스트

Winney·2021년 1월 11일
1
post-thumbnail

1. 가장 높은 수익

prices는 배열이며, 각 요소는 매일의 주식 가격이다.
만약 한 번만 거래할 수 있다면 = 사고 팔 수 있다면,
제일 큰 이익은 얼마인지를 구하는 함수

  • 입출력 예시 :
  • [7,1,5,3,6,4] => 5 // 둘째(idx: 1) 날에 사서 다섯째(idx:4) 날에 파는게 가장 이득
  • [7,6,4,3,1] => 0 // 계속 가격이 떨어지기 때문에 수익이 없다.

작성

const maxProfit = prices => {
  let max = 0;
  for(let i = 0; i < prices.length;i++) {
    for(let j = i+1; j < prices.length;j++) {
      if(max < prices[j]-prices[i]){
        max = prices[j]-prices[i]
      }
    }
    }
  return max;
};

for문을 두 번 사용했고 배열의 각 인덱스는 각 날짜이므로 오늘사서 어제파는 것은 불가능 하기 때문에 let j = i+1을 해 이미 지나온 날짜는 비교하지 않도록 했다.
이후로는 수익을 비교해서 max 값을 찾아서 return 하였다.

다른 풀이(모범 답안)

const maxProfit = prices => {
    var min = Number.MAX_SAFE_INTEGER; 
    var max = 0;
    for (var i = 0; i < prices.length; i++) {
        min = Math.min(min, prices[i]);
        max = Math.max(max, prices[i] - min);
    }
    return max;
};

Math.min, Math.max를 이용한 풀이는 생각을 못 했기 때문에 좋은 학습이 되었다.
Number.MAX_SAFE_INTEGER에 대해서도 알게되었다.
Number.MAX_SAFE_INTEGER는 'JavaScript에서 안전한 최대 정수값을 가진다.'고 되어 있다.
최근에 읽었던 코어자바스크립트에서 JS는 메모리 관리에 대한 압박에서 자유로워져 숫자의 경우 정수형인지 부동소수형인지를 구분하지 않고 8바이트(64비스)를 확보한다고 했다.

그래서 JS는 -(253 - 1)과 253 - 1 사이의 수만 안전하게 표현 할 수 있다!
(-9007199254740991과 9007199254740991 사이의 수)

  • 안전하게 표시한다 =정수를 정확하고 올바르게 비교할 수 있음을 의미

그렇게 때문에 위의 코드에서 min은 price[i]과 비교되어야 하는 수이고 당연하지만! price[i]값이 더 작게 나와야지 올바른 계산이 된다.

이 말은 min에 Number.MAX_SAFE_INTEGER를 할당한 것은 JS에서 다룰 수 있는 최대의 정수값을 할당한 것이기 때문에 어떤 수가 들어와도 min과 비교 했을 때 더 작은 수가 되고 올바르게 함수가 작동 할 수 있다는 것이다.

여기까지가 내가 이해한 부분이다.
워낙에 얕은 지식을 가지고 있는지라 정확한지는 모르겠지만 나는 내가 알고 있는 것들을 연관시켜서 이해하는 공부를 할 때 가장 즐겁다.
이런 순간이 조만간 또 오기를 바라며 오늘의 포스팅을 마친다.

profile
프론트엔드 엔지니어

0개의 댓글