이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.
문제 설명
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;
public class sec04_03 {
public static int[] solution(int[] arr, int K) {
int[] result = new int[arr.length - K + 1];
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < K; i++) map.put(arr[i], map.getOrDefault(arr[i], 0) + 1);
result[0] = map.size();
int lPtr = 0;
for (int rPtr = K; rPtr < arr.length; ++rPtr)
{
map.put(arr[rPtr], map.getOrDefault(arr[rPtr], 0) + 1);
map.put(arr[lPtr], map.get(arr[lPtr]) - 1);
if (map.get(arr[lPtr]) == 0) map.remove(arr[lPtr]);
++lPtr;
result[rPtr - K + 1] = map.size();
}
return result;
}
public static void main(String[] args) throws IOException {
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());
st = new StringTokenizer(br.readLine());
int[] arr = new int[N];
for (int i = 0; i < N; i++) arr[i] = Integer.parseInt(st.nextToken());
for (int i : solution(arr, K)) System.out.print(i + " ");
}
}
설명
- 해시맵과 슬라이딩 윈도우 알고리즘을 사용한다.
- 배열의 처음 K개 원소를 HashMap에 추가하여 각 원소의 빈도를 기록하고, 첫 번째 결과를 result[0]에 저장한다.
- 왼쪽 포인터(lPtr)와 오른쪽 포인터(rPtr)를 사용하여 윈도우를 한 칸씩 이동한다.
- 오른쪽 포인터가 가리키는 새로운 원소를 HashMap에 추가하고, 왼쪽 포인터가 가리키는 원소를 제거하여 HashMap을 업데이트한다.
- 현재 HashMap의 크기를 result 배열에 저장한다.
'자료구조 & 알고리즘 > Inflearn' 카테고리의 다른 글
[인프런 알고리즘] Chapter 4, 5번 문제(K번째 큰 수) (0) | 2024.08.05 |
---|---|
[인프런 알고리즘] Chpater 4, 4번 문제(모든 아나그램 찾기) (0) | 2024.08.04 |
[인프런 알고리즘] Chpater 3, 2번 문제(아나그램(해쉬) (0) | 2024.08.02 |
[인프런 알고리즘] Chapter 4, 1번 문제(학급 회장) (0) | 2024.07.28 |
[인프런 알고리즘] Chpater 3, 6번 문제(최대 길이 연속부분 수열) (0) | 2024.07.27 |