fffo

열매 수확 본문

Programming/Algorithm

열매 수확

gggs 2021. 10. 7. 20:05

문제

[문제 설명] 길 위에 사과나무와 오렌지 나무가 있습니다. 사과 열매 하나당 1점, 오렌지 열매 하나당 -1점이라고 할 때, 길 위의 연속으로 이어진 나무에서 얻을 수 있는 최고 점수를 구하는 함수, solution을 완성해주세요. 예를 들어, 길 위에 있는 나무의 열매 중 사과 열매의 수는 양수로, 오렌지 열매 수는 음수로 표현된 fruits [-2, 5, -3, 6, 8, -1, -5, 3]가 있을 때 얻을 수 있는 최고 점수는 2번째부터 5번째까지 수확했을 때 점수인 16점(5 - 3 + 6 + 8) 입니다.

 

[제한 사항] - 열매 수확은 띄엄띄엄할 수 없으며, 연속된 나무의 모든 열매를 수확해야 합니다. - 사과 열매 하나는 1점, 오렌지 열매 하나는 -1점입니다. - 최소한 하나의 나무의 열매는 수확해야 합니다.

 

[입력 형식] - 길 위에 과일의 점수를 나타낸 fruits가 주어집니다. - fruits는 -1000 이상 1000 이하의 정수로 이루어진 배열입니다. - 길 위의 나무의 수는 1개 이상 10,000개 이하입니다.

 

[출력 형식] 길 위의 연속으로 이어진 나무에서 얻을 수 있는 최고 점수를 출력합니다.

접근 및 풀이

분류가 동적 프로그래밍이었는데 감이 안와서 그냥 패턴을 찾아서 풀었다. 주어진 과일 수들을 순차 탐색 하며 누적된 수와 음수인 수를 비교해가며 가장 큰 수를 리턴한다. 테스트케이스를 주지 않아서 오류 여부는 잘 모르겠다.

코드

function solution(fruits) {
  let acc = 0;
  let keep = 0;
  let max = 0;
  for (let i = 0; i < fruits.length; i++) {
    let now = fruits[i];
    if (max < acc) max = acc;
    if (now > 0) {
      if (acc + keep < 0) {
        acc = now;
      } else {
        acc += keep + now;
      }
      keep = 0;
    } else {
      keep += now;
    }
  }
  return acc > max ? acc : max;
}

출처

제로베이스 FE 온라인 코딩테스트

- 본 게시글은 개인의 학습 목적으로 게시한 것으로, 해당 과정의 모든 콘텐츠는 저작권법의 보호를 받습니다.
무단전재 및 재배포를 금지하며, 저작권법 위반 행위가 확인될 경우 강력하게 법적 대응합니다.

'Programming > Algorithm' 카테고리의 다른 글

배달  (0) 2021.10.08
괄호 회전하기  (0) 2021.10.08
후보키  (0) 2021.10.07
거리두기 확인하기  (0) 2021.10.06
[js문제풀이]방금 그 곡  (0) 2021.10.05
Comments