Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 연속부분수열
- 10991
- 알고리즘
- 큰 수 출력하기
- 점수계산
- 뒤집은 소수
- 등수구하기
- 임시반장 정하기
- 공통원소 구하기
- 최대 길이
- 투 포인터
- 백준
- 인프런
- java
- 격자판
- 아스키코드
- 두 배열 합치기
- 모든행과열대각선의합
- 배열
- array
- 10992
- 코테준비
- Pointer
- GitHub #Commit #BaekJoon
- 가장 짧은 문자거리
- ArrayList
- Two Pointer
- 보이는 학생
- 누적 계산
- 자바
Archives
- Today
- Total
ezhoon
[인프런] 03_03 최대 매출 본문
📖 문제
- 첫 줄에 N과 K가 주어진다.
- 두 번째 줄에 N개의 숫자열이 주어진다.
- N일 동안의 매출기록을 주고 연속된 K일 동안의 최대 매출액이 얼마인지 구하시오.

⚠️ 주의사항
- for문을 다 돌려서 할 수도 있지만 슬라이딩 윈도우 방식으로 해결 해보겠습니다.
✍️ 이해
슬라이딩 윈도우 방식이란
배열의 처음부터 순차적으로 탐색하고 부분 배열을 꺼내 보는 것입니다.
이때 부분 배열의 길이는 고정적(일정)합니다.
아래와 같은 배열이 주어지고 10일 동안의 매출 중에 3일 동안의 최대 매출액은 얼마인지 구할려고 해보겠습니다.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
12 | 15 | 11 | 20 | 25 | 10 | 20 | 19 | 13 | 15 |
* 슬라이딩 윈도우 방식으로 해결
* 1. N개 만큼의 숫자열 입력, K입력
* 2. N개 의 배열 중에 K일 동안의 최대 값을 구해야 하므로 0 ~ K 일 동안의 값을 하나 생성
* 2-1. temp[0] + temp[1] ~ temp[K-1] + temp[K] 합으로 이루어진 변수 sum -> answer 저장
* 2-2. sum 에서 맨 처음 값 temp[0]을 빼고 temp[K+1] 추가 후 Math.max(answer, sum) -> answer 저장
* 3. return answer
✏️ 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Java03_03 {
public int solution(int N, int K, int[] temp) {
int sum = 0, answer = 0;
for (int i = 0; i < K; i++) {
sum += temp[i]; // 윈도우 생성
}
answer = sum; // 최댓값을 구해야 하므로 우선 answer에 sum값 대입
for (int i = K; i < N - K; i++) {
sum += (temp[i] - temp[i - K]);
// [] -> 윈도우 현재 sum 값
// [10 7 8] 7 8 2 9 -> 10 [7 8 7] 8 2 9
// 즉 맨 처음꺼는 빼고 마지막에서 + 1 된 값은 더해주면 된다.
answer = Math.max(answer, sum); // answer 와 sum 중 큰 값이 -> answer 대입
}
return answer;
}
public static void main(String[] args) throws IOException {
Java03_03 T = new Java03_03();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[] temp = new int[N];
st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < N; i++) {
temp[i] = Integer.parseInt(st.nextToken());
}
System.out.println(T.solution(N, K, temp));
}
}
'[Java] 인프런 문제풀이 > Two pointers, Sliding window' 카테고리의 다른 글
[인프런] 03_05 연속된 자연수의 합 (Two pointer) (0) | 2022.01.21 |
---|---|
[인프런] 03_04 연속 부분 수열 (Two pointers) (0) | 2022.01.21 |
투 포인터, 슬라이딩 윈도우 (0) | 2022.01.21 |
[인프런] 03_02 공통원소 구하기 (0) | 2022.01.21 |
[인프런] 03-01 두 배열 합치기 (0) | 2022.01.21 |