인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)

5. 최대 매출(Sliding Window)

코드 리뷰 부탁드립니다 :)

작성

·

427

·

수정됨

0

안녕하세요 선생님 😀

강의 잘 보고 있습니다.

저는 count 변수를 두고 값을 저장하고 i값을 변경하여 사용하였는데 이렇게 작성해도 되는지 궁금하여 질문을 올리게 되었습니다. 또 아래와 같이 for문 안에 있는 i 값을 변경해도 괜찮은지도 궁금합니다!

 

function solution(k: number, arr: number[]): number {
  let sum: number = 0;
  let count: number = 0;
  let max: number = 0;

  for (let i = 0; i < arr.length; i++) {
    if (count < k) {
      sum += arr[i];
      count++;
    } else {
      if (max < sum) {
        max = sum;
      }
      i = i - count;
      count = 0;
      sum = 0;
    }
  }
  return max;
}

감사합니다

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
연이님, 코드 공유해주셔서 감사합니다.

변수 count를 사용해서 일정 횟수만큼 연산을 수행하고, 이를 통해 for 반복문 안에서 i의 값을 조정하는 방식으로 구현하신 것 같네요. 일반적으로 for 문의 증감식(i++)에서 조정하는 것은 피하는 게 좋습니다. 그 이유는 for 문의 반복 로직을 이해하기 어렵게 만들고, 루프의 흐름을 예측하기 어렵게 하기 때문입니다.

하지만 특정한 상황에서는 i 값을 조정해야 할 수도 있으며, 이는 실제로 유효한 프로그래밍 기법 중 하나입니다. 그러나 이럴 때는 로직이 명확하게 이해될 수 있도록 코드를 작성하는 것이 중요하며, 가능하면 더 나은 대안을 찾아보는 것이 좋습니다.

본 코드의 경우, sum을 구하는 부분을 개선할 필요가 있어 보입니다. 예를 들어, ‘슬라이딩 윈도우’ 알고리즘을 사용하면 i 값을 직접 조정하지 않고도 문제를 해결할 수 있습니다. 현재 구현하신 로직으로는 arr 배열을 여러 번 반복하게 되므로, 효율성 측면에서 개선의 여지가 있습니다.

for 문을 한 번만 사용하고, 완성된 window의 첫 번째 값을 빼고 다음 값을 더하는 방식으로 최대합을 구하는 슬라이딩 윈도우 알고리즘을 적용해 보세요. 이렇게 하면 배열을 한 번만 순회하면서 문제를 해결할 수 있습니다.

슬라이딩 윈도우 알고리즘에 대한 참고 코드는 아래와 같습니다:

function solution(k: number, arr: number[]): number {
  let sum: number = 0;
  let max: number = 0;
  
  // 처음 k개의 요소의 합을 구함
  for (let i = 0; i < k; i++) {
    sum += arr[i];
  }
  max = sum;

  // 슬라이딩 윈도우로 나머지 요소들 확인
  for (let i = k; i < arr.length; i++) {
    sum += arr[i] - arr[i - k];
    max = Math.max(max, sum);
  }

  return max;
}

위와 같이 코드를 작성하면, 복잡도는 O(n)으로 i 값을 조정하지 않고 문제를 해결할 수 있습니다.

코드 개선에 도움이 되셨길 바라며, 추가로 궁금한 점이 있으시면 언제든지 질문해주세요.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기