매출액의 종류 (Hashmap + Sliding Window)

Seungmin Lim·2022년 2월 9일
0

코딩문제연습

목록 보기
36/63

문제

나의풀이

import java.util.*;

class Main {
	public ArrayList<Integer> solution(int n, int k, int[] arr) {
		ArrayList<Integer> answer = new ArrayList<>();
		HashMap<Integer,Integer> map = new HashMap<>();
		int rt =0;
		for(int lt=0; lt<=n-k; lt++) {
			while(rt-lt < k) { map.put(arr[rt], map.getOrDefault(arr[rt], 0)+1);rt++;}
			answer.add(map.size());
			//arr[lt]값 빼주기.
			if(map.get(arr[lt]) == 1) {map.remove(arr[lt]);} 
			else map.put(arr[lt], map.get(arr[lt])-1);
		}
		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 + " ");
		}
	}

}

++ lt -> rt를 쫓아가는 방법

import java.util.*;

class Main {
	public ArrayList<Integer> solution(int n, int k, int[] arr) {
			int answer = 0;	 
			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++) {
				//rt값 추가.
				HM.put(arr[rt], HM.getOrDefault(arr[rt], 0)+1);
				answer.add(HM.size());
				
				//lt가쫓아감. (value가 0이면 remove)
				HM.put(arr[lt],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 + " ");
		}
	}
	
}

풀이방법

  1. 처음 초기값을 넣지않고 바로 for문안의 while문을 통해 k길이만큼 탐색하고 해쉬맵에 넣었다.
    map.size()로 키의 갯수를 구하고 lt가 늘어나기전에 그 전 lt값을 빼줬는데, 만약 카운팅이 1개라면 키값이 사라진다. 1보다 많다면 갯수가 1개 줄어든다.
  1. 초기값으로 인덱스가 k-1 전까지 값을 넣는다.
    예) k=4면 [20 12 20 10 23 17 10]
    HM에는 (0~2번값) 20 : 2, 12 : 1 이 들어가있다.
    rt는 k-1부터 시작 (10부터)해서 배열의 길이까지 탐색한다.
    rt가 1씩 증가하면서 lt가 따라가는 for문을 통해,
    HM에 3번값(10)이 put되고 answer에 key의 갯수를 담는다.
    arr[lt]값을 HM에서 빼고 (만약 value=0 즉, 개수 가 0이된다면 존재하지 않는것으로 간주) lt를 1증가시켜 따라가게한다.

핵심

초기값을 설정해줘서 푸는방법을 숙지하자!

0개의 댓글