📌 문제 설명
현수의 아빠는 제과점을 운영하고 있고, N일 동안의 매출기록을 가지고 있습니다. 현수는 이 기록을 가지고 연속된 K일 동안의 매출액 종류의 개수를 구하려 합니다.
즉, 매일의 매출 데이터를 보고 연속된 K일 동안 서로 다른 매출액(숫자)의 개수를 계산하여 출력합니다.
📝 입력 & 출력
입력
- 첫째 줄: N(5 ≤ N ≤ 100,000), K(2 ≤ K ≤ N)
- 둘째 줄: N개의 매출기록 숫자 (각 숫자는 0 이상 500 이하)
출력
- 각 연속 K일 간의 매출액 종류의 수를 공백으로 구분하여 출력
🔸 예제 입력 & 출력
예제 입력 1
7 4
20 12 20 10 23 17 10
예제 출력 1
3 4 4 3
💡 해결 방법
- 슬라이딩 윈도우와 HashMap을 조합하여 효율적으로 각 구간의 매출 종류를 계산합니다.
알고리즘 순서
- 처음 K일을 맵에 기록하고, 종류 수 저장
- K일부터 끝까지 반복하며
- 왼쪽 끝 요소는 count -1 (0이면 삭제)
- 오른쪽 새 요소는 count +1 (or 새로 추가)
- 각 단계마다 map.size()를 결과에 저장
- HashMap을 사용해 각 매출액이 몇 번 등장하는지 세고, 0이 되면 제거하여 정확한 종류 수 유지
💻 코드 구현 (Java)
package partTwoPointers;
import java.util.*;
public class Problem3 {
public ArrayList<Integer> solution(int n, int k, int[] arr){
ArrayList<Integer> result = new ArrayList<>();
HashMap<Integer, Integer> map = new HashMap<>();
// 초기 윈도우 설정
for(int i=0; i<k; i++) {
map.put(arr[i], map.getOrDefault(arr[i], 0)+1);
}
result.add(map.size());
// 슬라이딩 윈도우 이동
for(int i=k; i<n; i++) {
// 왼쪽 값 제거
map.put(arr[i-k], map.get(arr[i-k]) - 1);
if(map.get(arr[i-k]) == 0) map.remove(arr[i-k]);
// 오른쪽 새 값 추가
map.put(arr[i], map.getOrDefault(arr[i], 0)+1);
result.add(map.size());
}
return result;
}
public static void main(String[] args) {
Problem3 T = new Problem3();
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();
}
for(int x : T.solution(n, k, arr)) {
System.out.print(x + " ");
}
kb.close();
}
}
📖 코드 설명
- map.getOrDefault(key, 0) : key가 없으면 0으로 시작
- map.size() : 현재 윈도우 내 서로 다른 매출액 종류 수
- map.remove(key) : 등장 횟수가 0이 되면 map에서 완전히 제거 (정확한 종류 수 계산)
⏳ 시간 복잡도 분석
- 각 원소는 한 번씩 윈도우에 들어가고 한 번씩 나감 → O(N)
- HashMap의 삽입/삭제/조회는 O(1) 평균
- 총 시간 복잡도: O(N)
출처: 인프런 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 강의 | 김태원 - 인프런
김태원 | , 자바(Java) 알고리즘 문제풀이 채점사이트를 통해 기초부터 준비해보세요! 💪 [사진] 이 강의는 [사진] 자바(Java)로 코딩테스트 준비를 하고 계신 분께 추천드려요! 문제는 기초~ 중급
www.inflearn.com
'코딩테스트 > 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비' 카테고리의 다른 글
| 섹션 4. HashMap, TreeSet - 5. K번째 큰 수 (0) | 2025.03.31 |
|---|---|
| 섹션 4. HashMap, TreeSet - 4. 모든 아나그램 찾기 (0) | 2025.03.31 |
| 섹션 4. HashMap, TreeSet - 2. 아나그램(해쉬) (0) | 2025.03.30 |
| 섹션 4. HashMap, TreeSet - 1. 학급 회장(해쉬) (0) | 2025.03.30 |
| 섹션 3 투 포인터 & 슬라이딩 윈도우 - 5. 연속된 자연수의 합(수학) (0) | 2025.03.30 |