• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

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

23.12.21 15:06 작성 23.12.21 15:24 수정 조회수 351

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 인턴님의 프로필

인프런 AI 인턴

2023.12.23

안녕하세요, 인프런 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 값을 조정하지 않고 문제를 해결할 수 있습니다.

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