HashMap, TreeSet(자료구조) - 0403. 매출액의 종류
private static String solution(int n, int m, int[] arr) {
StringBuilder answer = new StringBuilder();
HashMap<Integer, Integer> map = new HashMap<>();
for(int i=0; i<m; i++) {
map.merge(arr[i], 1, Integer :: sum);
}
answer.append(map.size()).append(" ");
for(int i=m; i<n; i++) {
map.merge(arr[i-m], -1, Integer :: sum);
if(map.get(arr[i-m]) < 1) map.remove(arr[i-m]);
map.merge(arr[i], 1, Integer :: sum);
answer.append(map.size()).append(" ");
}
return answer.toString();
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] arr = new int[n];
for(int i=0; i<n; i++) {
arr[i] = sc.nextInt();
}
System.out.println(solution(n, m, arr));
}
public ArrayList<Integer> solution(int n, int k, int[] arr){
ArrayList<Integer> answer = new ArrayList<>();
HashMap<Integer, Integer> HM = new HashMap<>();
for(int i=0; i<k-1; i++){
HM.put(arr[i], HM.getOrDefault(arr[i], 0)+1);
}
int lt=0;
for(int rt=k-1; rt<n; rt++){
HM.put(arr[rt], HM.getOrDefault(arr[rt], 0)+1);
answer.add(HM.size());
HM.put(arr[lt], HM.get(arr[lt])-1);
if(HM.get(arr[lt])==0) HM.remove(arr[lt]);
lt++;
}
return answer;
}
public static void main(String[] args){
Main T = new Main();
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+" ");
}
해당 문제는 sliding window
와 Map
을 이용하여 해결할 수 있다.
Map
에 최초 k
일 동안의 발생한 매출액을 key
, 해당 매출액 발생 빈도를 value
로 보관한다.
그 다음 날부터 매출액을 순회하며 중복되지 않는 매출액의 종류를 카운트한다.
처음 구현 시에 지금과 동일한 로직에서 시간 초과가 발생했다. 원인은 answer
을 담는 자료형.
습관 처럼 String
자료형으로 만들었더니 반복문을 돌며 매번 새로운 객체를 생성하고,
이 것이 실행 시간을 더욱 오래 걸리게 하였다. 상황에 맞게 StringBuilder 를 애용하자...