최초 슬라이딩 윈도우를 셋팅해서 하나씩 전진하며 풀이해야 이중 for 문을 사용하지 않는 듯.
🤔 고민한 내용
HashMap 과 Sliding Window 알고리즘을 적절히 활용해서 풀이하자.
편하게 풀려고 Scanner 를 사용했는데 시간초과 떠서 BufferedReader 로 바꿔서 통과 !
💪 새롭게 배운 내용
Sliding Window 복습 ㅎㅎ
🆘 이해가 어려운 내용
❌ 해결하지 못한 이유
✅ 본인 풀이
🏋️♀️ 시도횟수 : 2회 | ⏱ 걸린시간 : 1091ms | 💾 메모리 : 40MB
package study.section4;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Section0403 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st1 = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st1.nextToken());
int k = Integer.parseInt(st1.nextToken());
StringTokenizer st2 = new StringTokenizer(br.readLine());
int[] arr = new int[n];
for (int i=0; i<n; i++) {
arr[i] = Integer.parseInt(st2.nextToken());
}
List<Integer> answers = solution(arr, n, k);
answers.forEach(s -> System.out.print(s + " "));
}
private static List<Integer> solution(int[] arr, int n, int k) {
List<Integer> answers = new ArrayList<>();
Map<Integer, Integer> window = new HashMap<>();
int lt = 0;
int rt = k -1;
// TODO : 최초 윈도우 설정
for (int i = 0; i < rt; i++) {
window.put(arr[i], window.getOrDefault(arr[i], 0) + 1);
}
// RT 를 끝 최초 윈도우 맨 끝 부분 부터 하나 씩 증가시키기 위해서 i = rt, i < n 으로 반복문 설정
for (int i = rt; i < n; i++) {
window.put(arr[i], window.getOrDefault(arr[i], 0) + 1);
answers.add(window.size());
window.put(arr[lt], window.get(arr[lt]) - 1);
if (window.get(arr[lt]) == 0) {
window.remove(arr[lt]);
}
lt ++;
}
return answers;
}
}
// N = 7일, K = 4일 (연속된 일수)
// N = { 20, 12, 20, 10, 23, 17, 10 }
// 첫 번째 구간 {20, 12, 20, 10} - 서로 다른 숫자 3개
// 두 번째 구간 {12, 20, 10 ,23} - 서로 다른 숫자 4개
// 세 번쨰 구간 {20, 10, 23, 17} - 서로 다른 숫자 4개
// 네 번째 구간 {10, 23, 17, 10} - 서로 다른 숫자 3개
// 출력 - 3 4 4 3
📌 문제
⭐️ 아이디어
🤔 고민한 내용
💪 새롭게 배운 내용
🆘 이해가 어려운 내용
❌ 해결하지 못한 이유
✅ 본인 풀이
🏋️♀️
시도횟수
: 2회 | ⏱걸린시간
: 1091ms | 💾메모리
: 40MB참고한 자료