작성
·
64
0
import java.util.Scanner;
public class Main {
public int solution(int n, int m, int[] arr){
int answer = 0, sum = 0;
for(int i=0;i<m;i++){
sum += arr[i];
}
for(int i=0;i<n-m;i++){
answer = Math.max(answer, sum);
sum = sum - arr[i] + arr[i+m];
}
//answer = Math.max(answer, sum);
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
int m = kb.nextInt();
int[] arr = new int[n];
for(int i=0;i<n;i++) arr[i] = kb.nextInt();
System.out.println(T.solution(n, m, arr));
}
}
해당 코드가 왜 정답이 되는지 모르겠습니다.
위 코드처럼 작성하면 for문의 제일 마지막번째에 sum과 answer를 비교하지 않고 answer를 리턴하게 되는건데 그럼 오답이지 않나요?
10 3
1 2 3 4 5 6 7 8 9 10
이렇게 마지막 연속된 K일에서 최댓값으로 주어진다면 값이 제대로 안 나오는데 왜 정답이 되는지 궁금합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
이진욱님의 질문은 “최대 매출” 문제에서 주어진 코드가 왜 정답인지에 대한 이해와 관련이 있습니다. 코드가 마지막 연속된 K일의 합을 제대로 비교하지 않는 듯 보이지만 정답이 나오는 이유를 질문하셨습니다.
이와 관련된 내용을 이전에 다룬 질문 중 하나에서 발견할 수 있습니다. 해당 질문은 “최대매출 한번 봐주세요”에서 유사한 문제 상황과 코드 구조에 대한 설명이 제공됩니다. 질문자 역시 for문 내에서 윈도우의 합을 계산하고 max 값을 업데이트하는 로직에 대해 궁금증을 제기하였습니다. 강의 내용과 관련된 질문에 대한 답변에서 이러한 로직의 정당성과 정답 처리되는 이유에 대해 설명이 제공됩니다.
구체적으로, 제공된 코드는 슬라이딩 윈도우 기법을 사용하여 문제를 해결합니다. 이 접근법은 윈도우의 시작 부분을 제외하고 새로운 원소를 더하며 윈도우를 이동시키는 기법입니다. 질문에서 제시된 코드는 마지막 for문에서 다음 윈도우로 넘어갈 때 새로운 값을 더하고 이전 값을 뺌으로써 최대 합을 업데이트합니다. 검증 로직이 윈도우가 이동할 때마다 적용되기 때문에, 질문에서 우려한 바와 같이 마지막 윈도우에 대한 비교가 실제로는 이루어집니다.
이러한 처리 방식은 간과하기 쉬운 부분인데, 이는 슬라이딩 윈도우 기법의 핵심적인 부분 중 하나입니다. 이 기법을 사용하면 시간 복잡도를 효율적으로 관리하며 문제를 해결할 수 있습니다.
추가로 질문하신 코드의 작성 방식과 유사한 상황에 대한 설명은 강의 내에서 제공되는 지식을 바탕으로 학습자가 코드의 작동 방식을 이해하는 데 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.