티스토리 뷰

알고리즘/코딩테스트 공부

5-5 최대 매출

YG - 96년생 , 강아지 있음, 개발자 희망 2021. 12. 1. 22:59

문제

현수의 아빠는 제과점을 운영합니다. 현수 아빠는 현수에게 N일 동안의 매출기록을 주고 연속
된 K일 동안의 최대 매출액이 얼마인지 구하라고 했습니다.
만약 N=10이고 10일 간의 매출기록이 아래와 같습니다. 이때 K=3이면
12 15 11 20 25 10 20 19 13 15
연속된 3일간의 최대 매출액은 11+20+25=56만원입니다.
여러분이 현수를 도와주세요.

풀이

function solution(k, arr) {
  let answer,
    sum = 0;
  let rt = 0,
    lt = 0;
  let max = Number.MIN_SAFE_INTEGER;
  for (let i = 0; i < arr.length; i++) {
    sum += arr[rt++];
    while (rt - lt > k) sum -= arr[lt++];
    if (max < sum) max = sum;
  }

  answer = max;
  return answer;
}

let a = [12, 15, 11, 20, 25, 10, 20, 19, 13, 15];
console.log(solution(6, a));

투포인터를 이용해서 sum에 arr[rt]를 더해주었고 rt -lt 값이 k값보다  초과라면 sum에 arr[lt]를 계속 뺴주었습니다.

다른 풀이

function solution(k, arr) {
  let answer,
    sum = 0;
  for (let i = 0; i < k; i++) {
    sum += arr[i];
    //console.log(i, sum);
  }
  answer = sum;
  for (let i = k; i < arr.length; i++) {
    sum += arr[i] - arr[i - k];
    answer = Math.max(answer, sum);
  }

  return answer;
}

let a = [12, 15, 11, 20, 25, 10, 20, 19, 13, 15];
console.log(solution(2, a));

윈도우 슬라이딩 기법을 이용해서 맨처음 k값만큼의 합을 더해 answer 에 저장해줍니다.

 

그리고 k부터 시작하는 for문을 만들어서 sum += arr[i] - arr[i-k]를 해주었습니다.

풀어서 설명드리자면 12,15,11,20,25 가 있고 k값이 3이라면

 

answer 에는 12+15+11 = 38 으로 저장을 해 둔뒤

 

k값만큼의 범위를 움직이는 것입니다.

 

answer 에 11 다음인  20 값을 더해주고 범위가 늘어났으니 맨 앞의 12를 뺴주는 방법입니다.

'알고리즘 > 코딩테스트 공부' 카테고리의 다른 글

5-7 아나그램(해쉬)  (0) 2021.12.02
5-6 학급 회장(해쉬)  (0) 2021.12.01
5-4 연속 부분수열 2  (0) 2021.12.01
5-3 연속 부분수열 1  (0) 2021.12.01
5-2 공통원소 구하기  (0) 2021.12.01
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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 31
글 보관함