Recent Posts
Link
250x250
오늘보다 더 나은 내일의 나에게_
자바 알고리즘 문제 풀이 Two pointers, Sliding window Q03_ 최대 매출 본문
ALGORITHM/inflearn_javaAlgorithm
자바 알고리즘 문제 풀이 Two pointers, Sliding window Q03_ 최대 매출
chan_96 2022. 3. 29. 21:28728x90
설명
현수의 아빠는 제과점을 운영합니다. 현수 아빠는 현수에게 N일 동안의 매출기록을 주고 연속된 K일 동안의 최대 매출액이 얼마인지 구하라고 했습니다.
만약 N=10이고 10일 간의 매출 기록이 아래와 같습니다. 이때 K=3이면
12 1511 20 2510 20 19 13 15
연속된 3일간의 최대 매출액은 11+20+25=56만원입니다.
여러분이 현수를 도와주세요.
입력
첫 줄에 N(5<=N<=100,000)과 K(2<=K<=N)가 주어집니다.
두 번째 줄에 N개의 숫자열이 주어집니다. 각 숫자는 500이하의 음이 아닌 정수입니다.
출력
첫 줄에 최대 매출액을 출력합니다.
예시 입력1
예시 출력10 3
12 15 11 20 25 10 20 19 13 15 56
코드
내가 입력한 코드
더보기package twoPointers_SlidingWindow; import java.util.Scanner; public class Q03 { public int solution(int N, int K, int[] arr) { int answer = 0; for(int i = 0;i <= N-K;i++) { if(answer < arr[i]+arr[i+1]+arr[i+2]) { answer = arr[i]+arr[i+1]+arr[i+2]; } } return answer; } public static void main(String[] args) { Q03 T = new Q03(); Scanner kb = new Scanner(System.in); int N = kb.nextInt(); int K = kb.nextInt(); int[] arr = new int[N]; for(int i = 0;i < N;i++) { arr[i] = kb.nextInt(); } System.out.println(T.solution(N,K,arr)); } }
해설 코드
더보기import java.util.*; class Main { public int solution(int n, int k, int[] arr){ int answer, sum=0; for(int i=0; i<k; i++) sum+=arr[i]; answer=sum; for(int i=k; i<n; i++){ sum+=(arr[i]-arr[i-k]); 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 k=kb.nextInt(); int[] arr=new int[n]; for(int i=0; i<n; i++){ arr[i]=kb.nextInt(); } System.out.print(T.solution(n, k, arr)); } }
풀이 및 정리
먼저 오랜만에 알고리즘 문제를 풀어서 감이 안 왔지만 조금 생각하다 보니 이전에 풀었던 문제들보다는 쉬운 편에 속했던 것 같다. 일단은 내가 푼 코드는 콘솔에 찍으면 정답처리는 되지만 채점은 오답이다...
손으로 쓰면서 풀면 생각보다 쉬운 것 같다. 아래와 같이 배열이 있다고 할 때 계산을 일단 해보자!
12 / 15 / 11 / 20 / 25 / 10 / 20 / 19 / 13 / 15
12/15/11 = 38 , 15/11/20 = 46, 11/20/25 = 56...... 이런 식으로 진행했을 때 제일 큰 합을 구하면 된다.
숫자의 인덱스가 0,1,2,3,4,5,6,7,8,9 일 때 더해지는 순서가 0,1,2 / 1,2,3 / 2,3,4 순서대로 더해지고 있다.
그러면 12/15/11 값 38, 다음에는 12/15/11 46이다.
12/15/11이 값은 12/15/11/20의 합에 12를 빼줘도 된다는 소리이다.
그렇다면 sum 변수를 선언하고 인덱스가 0,1,2의 합을 먼저 넣어준다.
그리고 위에 적은 방식처럼 계산해주면 된다.
12+15+11 => 12+15+11+20-12 => 15+11+20+25 - 15 => 11+20+25+10-11..이 순서대로 비교하면 된다.
Math.max(arg1, arg2) => arg1, arg2 중 큰 값 반환!
728x90
'ALGORITHM > inflearn_javaAlgorithm' 카테고리의 다른 글
자바 알고리즘 문제 풀이 Two pointers, Sliding window Q05_ 연속된 자연수의 합 (0) | 2022.04.06 |
---|---|
자바 알고리즘 문제 풀이 Two pointers, Sliding window Q04_ 연속 부분수열 (0) | 2022.03.30 |
자바 알고리즘 문제 풀이 Two pointers, Sliding window Q02_공통원소구하기 (0) | 2022.03.21 |
자바 알고리즘 문제 풀이 Two pointers, Sliding window Q01_두 배열 합치기 (0) | 2022.03.21 |
자바 알고리즘 문제 풀이 Array Q12_멘토링 (0) | 2022.02.22 |
Comments