Algorithm/๋ฐฑ์ค€

๋ฐฑ์ค€ 20922๋ฒˆ : ๊ฒน์น˜๋Š” ๊ฑด ์‹ซ์–ด

giraffe_ 2024. 1. 9. 19:56

https://www.acmicpc.net/problem/20922

 

20922๋ฒˆ: ๊ฒน์น˜๋Š” ๊ฑด ์‹ซ์–ด

ํ™๋Œ€๋ณ‘์— ๊ฑธ๋ฆฐ ๋„ํ˜„์ด๋Š” ๊ฒน์น˜๋Š” ๊ฒƒ์„ ๋งค์šฐ ์‹ซ์–ดํ•œ๋‹ค. ํŠนํžˆ ์ˆ˜์—ด์—์„œ ๊ฐ™์€ ์›์†Œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ๋“ค์–ด ์žˆ๋Š” ์ˆ˜์—ด์„ ์‹ซ์–ดํ•œ๋‹ค. ๋„ํ˜„์ด๋ฅผ ์œ„ํ•ด ๊ฐ™์€ ์›์†Œ๊ฐ€ $K$๊ฐœ ์ดํ•˜๋กœ ๋“ค์–ด ์žˆ๋Š” ์ตœ์žฅ ์—ฐ์† ๋ถ€๋ถ„ ์ˆ˜์—ด

www.acmicpc.net

 

 

 

 

 

 

๋ฌธ์ œ

  • ๊ฐ™์€ ์›์†Œ๊ฐ€ K๊ฐœ ์ดํ•˜๋กœ ๋“ค์–ด์žˆ๋Š” ์ตœ์žฅ ์—ฐ์† ๋ถ€๋ถ„ ์ˆ˜์—ด ๊ธธ์ด ๊ตฌํ•˜๊ธฐ

 

 

์ œํ•œ์‚ฌํ•ญ

  • N ≤ 20๋งŒ

 

 

 

 

 

ํ’€์ด

 ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ตฌ๊ฐ„์˜ ์‹œ์ž‘์ ๊ณผ ๋์ ์„ 2์ค‘ for๋ฌธ์„ ํ†ตํ•ด ๊ตฌํ•˜๊ณ , ์•ˆ์— ์žˆ๋Š” ์›์†Œ๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŠธํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ์ตœ๋Œ€ 20๋งŒ์œผ๋กœ, O(N^2)์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ‘ผ๋‹ค๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚  ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ O(N^2) ๋ฏธ๋งŒ์œผ๋กœ ๊ตฌ๊ฐ„์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋„๋ก, ํˆฌํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ์ƒ‰ํ•œ๋‹ค.

 

์ตœ์žฅ ์—ฐ์† ๋ถ€๋ถ„ ์ˆ˜์—ด์—์„œ ๊ฐ™์€ ์›์†Œ๊ฐ€ K๊ฐœ ์ดํ•˜๋กœ ๋“ค์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ๊ตฌ๊ฐ„์˜ ์‹œ์ž‘์ ๊ณผ ๋์ ์„ ๋ชจ๋‘ 0๋ฒˆ์งธ์—์„œ ์‹œ์ž‘ํ•ด, ์›์†Œ์˜ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ํฌ์ธํ„ฐ๋ฅผ ์ด๋™ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

  •  ์›์†Œ ๋ณ„ ๊ฐœ์ˆ˜ ์ €์žฅํ•˜๊ธฐ

 intํ˜•์˜ ๋ฐฐ์—ด์„ ์„ ์–ธํ•ด, ํ•ด๋‹น ์›์†Œ๋ฅผ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋กœํ•˜๊ณ , ํ•ด๋‹น ๊ฐ’์—๋Š” ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•ด์ค€๋‹ค. ๋ฌธ์ œ์—์„œ 100000 ์ดํ•˜์˜ ์–‘์˜ ์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆ˜์—ด์ด๋ผ๊ณ  ํ–ˆ์œผ๋ฏ€๋กœ, 100001 ๊ธธ์ด์˜ ๋ฐฐ์—ด์„ ์„ ์–ธํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

 

  • ํˆฌํฌ์ธํ„ฐ

 ์ฒ˜์Œ์—๋Š” ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ๋Š˜๋ ค๊ฐ€๋ฉฐ, ์›์†Œ์˜ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ์™ผ์ชฝ ํฌ์ธํ„ฐ๋ฅผ ๋Š˜๋ ค์คฌ๋‹ค. ์™ผ์ชฝ ํฌ์ธํ„ฐ ์กฐ์ •์ด ๋๋‚˜๊ณ  ๋‚˜๋ฉด, ๊ตฌ๊ฐ„์˜ ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐํ•ด max ๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์ฃผ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋“  ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•œ๋‹ค.

 

 

int[] count = new int[1000001];
int right = 0;
int max = 0;
		
for(int left = 0; left < N; left++) {
	while(right < N && count[arr[right]] < K) {
		count[arr[right]]++;
		right++;
	}
			
	max = Math.max(max, right - left);
	count[arr[left]]--;
}

 

 

 

๋ฐ˜๋ก€

10 3
1 1 1 2 2 1 1 1 1 1

output : 5

 

 

 

 ๋ฐ˜๋Œ€๋กœ ์™ผ์ชฝ ํฌ์ธํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ๋Š˜๋ ค๊ฐ€๋ฉฐ, ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๋Š” ์›์†Œ์˜ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ๋Š˜๋ ค์คฌ๋‹ค. ์ด๋ ‡๊ฒŒ ํ–ˆ๋”๋‹ˆ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ํ†ต๊ณผํ•œ๋‹ค.

 

 

 

 

 

์ฝ”๋“œ

package algorithm;

import java.io.*;
import java.util.*;

public class BOJ_๊ฒน์น˜๋Š”๊ฑด์‹ซ์–ด {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		int N = Integer.parseInt(st.nextToken()); //๋ฐฐ์—ด์˜ ๊ธธ์ด
		int K = Integer.parseInt(st.nextToken()); //๊ฐ€๋Šฅํ•œ ๊ฐ™์€ ์ •์ˆ˜์˜ ๊ฐœ์ˆ˜
		
		int[] arr = new int[N];
		
		st = new StringTokenizer(br.readLine());
		for(int i = 0; i < N; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		
		//๊ตฌํ˜„
		int[] count = new int[1000001]; //์›์†Œ๋ณ„ ๊ฐœ์ˆ˜ ์ €์žฅ
		int right = 0;
		int max = 0; //์ •๋‹ต: ์ตœ์žฅ ์—ฐ์† ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด
		
		for(int left = 0; left < N; left++) { //์™ผ์ชฝ์€ ํ•˜๋‚˜์”ฉ ์˜ฎ๊น€
			while(right < N && count[arr[right]] < K) { //K๊ฐœ ๋ฏธ๋งŒ์ผ๋•Œ๊นŒ์ง€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์˜ฎ๊น€
				count[arr[right]]++;
				right++;
			}
			
			max = Math.max(max, right - left); //์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹ 
			count[arr[left]]--; //์™ผ์ชฝ ์›์†Œ์˜ ์ˆ˜ ๋นผ์ฃผ๊ธฐ
		}
		
		System.out.println(max);
	}

}

 

 

 

 

 

 

๊ฒฐ๊ณผ

 

 

 

 

 

๋ฐฐ์šด์ 