인프런 커뮤니티 질문&답변
선생님 질문있습니다.
작성
·
150
1
import java.util.HashMap;
import java.util.Scanner;
public class Main {
static void Solution(int n, int k, int[] arr){
int lt = 0;
HashMap<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < k; i++) {
map.put(arr[i],map.getOrDefault(arr[i],0)+1);
}
String result = map.size()+" ";
for (int rt = k; rt < n; rt++) {
map.put(arr[rt],map.getOrDefault(arr[rt],0)+1);
map.put(arr[lt],map.getOrDefault(arr[lt],1)-1);
if(map.get(arr[lt]) == 0) map.remove(arr[lt]);
result += map.size()+" ";
lt++;
}
System.out.println(result);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
Solution(n, k, arr);
}
}
선생님, 만약 k = 4일때 강의에서는 0~2번까지만 미리 구해서 map에 넣어둔 상태에서 아래 투포인트 for문에서
1. rt값 더하고
2. map.size() 입력하고
3. lt값 빼고 , lt == 0 체크
이런식으로 진행하시는데
제 로직은 첫for문에서 0~3까지 다 구해놓고 처음 map.size()를 초기값으로 준 후 다음 투포인트 for문에서
1. rt값 더하고
2. lt값 뺴고, lt == 0 체크
3. map.size() 입력하고
이렇게 로직을 구현했는데 TimeLimit이 발생하네요.
결국에는 그림으로 설명해주신것 처럼 네칸씩 구하는
방식은 똑같은것 같은데 이유를 알 수 있을까요..
답변 1
0
김태원
지식공유자
안녕하세요^^
답을 result라는 스트링에 처리하면 속도가 떨어집니다.
다음 글을 참조하세요.
https://jaehun2841.github.io/2019/03/01/effective-java-item63/#%EC%84%9C%EB%A1%A0
ArrayList<Integer> result = new ArrayList<>(); 선언하시고
ArrayList에 add한 후 출력하시면 통과될겁니다.






오! 감사합니다. 선생님은 천재십니다.