본문 바로가기
알고리즘/JAVA

3. 매출액의 종류

by vivi 2021. 9. 20.

 

import java.util.*;

class Main {

	public ArrayList<Integer> solution(int K, int[] arr) {
		ArrayList<Integer> answer = new ArrayList<Integer>();
		Set<Integer> set = new HashSet<Integer>();
		for (int i = 0; i < arr.length - K + 1; i++) {
			for (int j = i; j < i + K; j++) {
				set.add(arr[j]);
			}
			answer.add(set.size());
			set.clear();
		}

		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(K, arr)) {
			System.out.print(x + " ");
		}
		kb.close();
	}

}

 

import java.util.*;

class Main {

	public ArrayList<Integer> solution(int K, int[] arr) {
		ArrayList<Integer> answer = new ArrayList<Integer>();
		Map<Integer, Integer> map = new HashMap<>();
		for (int i = 0; i < K; i++) {
			if (map.containsKey(arr[i])) {
				Integer val = map.get(arr[i]) + 1;
				map.replace(arr[i], val);
			} else {
				map.put(arr[i], 1);
			}
		}

		int num = 0;
		for (int val : map.values()) {
			if (val != 0)
				num++;
		}
		answer.add(num);

		for (int i = 0; i < arr.length - K; i++) {

			map.replace(arr[i], map.get(arr[i]), map.get(arr[i]) - 1);
			if (map.containsKey(arr[i + K])) {
				Integer val = map.get(arr[i + K]) + 1;
				map.replace(arr[i + K], val);
			} else {
				map.put(arr[i + K], 1);
			}
			num = 0;
			for (int val : map.values()) {
				if (val != 0)
					num++;
			}
			answer.add(num);

		}

		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(K, arr)) {
			System.out.print(x + " ");
		}
		kb.close();
	}

}

이전에 작성한 코드가 답은 맞는데 테스트케이스 4,5가 시간초과되어서 다시 작성한 코드. 하지만 이것도 테스트케이스 5에서 시간초과가 되었다.

 

 

import java.util.*;

class Main {

	public ArrayList<Integer> solution(int K, int[] arr) {
		ArrayList<Integer> answer = new ArrayList<Integer>();
		Set<Integer> set = new HashSet<Integer>();
		for (int i = 0; i < K; i++) {
			set.add(arr[i]);
		}
		answer.add(set.size());
		for (int i = 0; i < arr.length - K; i++) {
			boolean check = false;
			for (int j = i + 1; j < i + K + 1; j++) {
				if (arr[i] == arr[j]) {
					check = true;
					break;
				}
			}
			if (!check) {
				set.remove(arr[i]);
			}
			set.add(arr[i + K]);
			answer.add(set.size());
		}
		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(K, arr)) {
			System.out.print(x + " ");
		}
		kb.close();
	}
}

테스트 케이스를 통과한 코드

 

 

import java.util.*;

class Main {
	public ArrayList<Integer> solution(int K, int[] arr) {
		ArrayList<Integer> answer = new ArrayList<Integer>();
		Map<Integer, Integer> map = new HashMap<>();
		for (int i = 0; i < K; i++) {
			map.put(arr[i], map.getOrDefault(arr[i], 0) + 1);
		}
		for (int i = 0; i < arr.length - K; i++) {
			answer.add(map.size());
			map.put(arr[i], map.getOrDefault(arr[i], 0) - 1);
			map.remove(arr[i], 0);
			map.put(arr[i + K], map.getOrDefault(arr[i + K], 0) + 1);
		}
		answer.add(map.size());
		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(K, arr)) {
			System.out.print(x + " ");
		}
		kb.close();
	}
}

HashMap과 sliding window를 사용한 코드

'알고리즘 > JAVA' 카테고리의 다른 글

1. 두 배열 합치기  (0) 2021.09.21
4. 모든 아나그램 찾기  (0) 2021.09.20
6. 뒤집은 소수  (0) 2021.09.20
5. 소수(에라토스테네스 체)  (0) 2021.09.20
2. 아나그램(해쉬)  (0) 2021.09.19

댓글