작성자 없음
작성자 정보가 삭제된 글입니다.
작성
·
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
값을 조정하지 않고 문제를 해결할 수 있습니다.
코드 개선에 도움이 되셨길 바라며, 추가로 궁금한 점이 있으시면 언제든지 질문해주세요.