Hello Ocean! ๐ŸŒผ

[์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋””] ๋ฐฑ์ค€ #2531 ํšŒ์ „์ดˆ๋ฐฅ ๋ณธ๋ฌธ

Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋””] ๋ฐฑ์ค€ #2531 ํšŒ์ „์ดˆ๋ฐฅ

bba_dda 2020. 4. 4. 00:16
๋ฐ˜์‘ํ˜•

[๋ฌธ์ œ]

ํšŒ์ „ํ•˜๋Š” ๋ฒจํŠธ ์œ„์— ์œ„์™€ ๊ฐ™์ด ์ดˆ๋ฐฅ๋“ค์ด ์žˆ๋‹ค. ๋ฒจํŠธ ์œ„์—๋Š” ๊ฐ™์€ ์ข…๋ฅ˜์˜ ์ดˆ๋ฐฅ์ด ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

์†๋‹˜์€ ์ดˆ๋ฐฅ์„ ๊ณจ๋ผ์„œ ๋จน์„ ๊ฒƒ์ด๋‹ค. 

1. ์—ฐ์†์œผ๋กœ k์ ‘์‹œ๋ฅผ ๋จน์„ ๊ฒฝ์šฐ, ํ• ์ธ๋œ ๊ฐ€๊ฒฉ์„ ์ง€๋ถˆํ•œ๋‹ค.

2. ๊ฐ ๊ณ ๊ฐ์—๊ฒŒ ์ดˆ๋ฐฅ ์ข…๋ฅ˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์“ฐ์—ฌ์ง„ ์ฟ ํฐ์„ ๋ฐœํ–‰ํ•˜๊ณ , ์†๋‹˜์ด 1๋ฒˆ ํ–‰์‚ฌ์— ์ฐธ๊ฐ€ํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ์ดˆ๋ฐฅ 1์ ‘์‹œ๋ฅผ ๋ฌด๋ฃŒ๋กœ ์ œ๊ณตํ•œ๋‹ค. ๋ฒจํŠธ ์œ„์— ํ•ด๋‹น ์ดˆ๋ฐฅ์ด ์—†์„ ๊ฒฝ์šฐ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ์ œ๊ณตํ•œ๋‹ค.

์†๋‹˜์€ ์œ„์˜ ํ–‰์‚ฌ์— ์ฐธ์—ฌํ•˜์—ฌ ์ตœ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์ดˆ๋ฐฅ์„ ๋จน์œผ๋ ค๊ณ  ํ•œ๋‹ค. 

 

[input]

๋ฒจํŠธ์— ๋†“์ธ ์ ‘์‹œ์˜ ์ˆ˜ N ( 2 โ‰ค N โ‰ค 30000 )

์ดˆ๋ฐฅ์˜ ๊ฐ€์ง“์ˆ˜ d ( 2 โ‰ค d โ‰ค 3000 )

์—ฐ์†ํ•ด์„œ ๋จน๋Š” ์ ‘์‹œ์˜ ์ˆ˜ k ( 2 โ‰ค k โ‰ค 3000 (k โ‰ค N) )

์ฟ ํฐ๋ฒˆํ˜ธ c ( 1 โ‰ค c โ‰ค d )

 

N d k c

์ดˆ๋ฐฅ ์ข…๋ฅ˜ (ํ•œ์ค„์”ฉ)

 

[output]

์ฃผ์–ด์ง„ ํšŒ์ „ ์ดˆ๋ฐฅ ๋ฒจํŠธ์—์„œ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์ดˆ๋ฐฅ ๊ฐ€์ง“์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’

 

[ํ’€์ด]

์ฒซ ๋ฒˆ์งธ.

count ์™€ kind๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ์ด์šฉํ•˜์ž.

count  = [start~c๊ฐ€ ๋‚˜์˜ฌ ๋•Œ ๊นŒ์ง€ ์ ‘์‹œ ๊ฐœ์ˆ˜, ... , c~c ์ ‘์‹œ ๊ฐœ์ˆ˜, ... , c~end ์ ‘์‹œ ๊ฐœ์ˆ˜]

kind = [start~c๊ฐ€ ๋‚˜์˜ฌ ๋•Œ ๊นŒ์ง€ ์ดˆ๋ฐฅ ์ข…๋ฅ˜, ... , c~c ์ดˆ๋ฐฅ ์ข…๋ฅ˜, ... , c~end ์ดˆ๋ฐฅ ์ข…๋ฅ˜]

c=30

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์–ด๋–ค ๊ฒฝ์šฐ์—์„œ๋Š” ๋น ๋ฅด๊ฒŒ output์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ์ „ํžˆ ์™„์ „ํƒ์ƒ‰์„ ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•˜์˜€๋‹ค. 

์™„์ „ํƒ์ƒ‰์˜ ๊ฒฝ์šฐ ์ตœ์•…์˜ ๋ณต์žก๋„๊ฐ€ O(N*k) = 3000000 * 3000 = 90์–ต ์ด๋ฏ€๋กœ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

๋‘ ๋ฒˆ์งธ.(์ตœ์ข…)

์ด ๋ฌธ์ œ์— ๊ด€ํ•ด ์กฐ์‚ฌํ•˜๋˜ ์ค‘ '์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ' ๊ธฐ๋ฒ•์œผ๋กœ ํ’€์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค. 

์ง€๋‚œ๋ฒˆ ์Šคํ„ฐ๋””์—์„œ ๋‚˜์™”๋˜ ๊ธฐ๋ฒ•์ธ๋ฐ, ์™„์ „ํƒ์ƒ‰๊ณผ์˜ ๋‹ค๋ฅธ ์ ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ด ๋‚˜์ค‘์— ๊ณต๋ถ€ํ•  ๊ฒƒ์œผ๋กœ ๋ฏธ๋ค„๋‘์—ˆ๋˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. 

์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋Š” ์œˆ๋„์šฐ๊ฐ€ ๋ฏธ๋„๋Ÿฌ์ง€๋“ฏ์ด ๋ฐฐ์—ด์˜ ์ฒซ ๋ถ€๋ถ„ ๋ถ€ํ„ฐ ๋ ๋ถ€๋ถ„๊นŒ์ง€ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

์œ„์˜ ์ž…๋ ฅ์„ ์˜ˆ๋กœ๋“ค๋ฉด ์ด๋Ÿฐ์‹์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋œ๋‹ค. 

 

์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ๋ณด๋ฉด ์™„์ „ํƒ์ƒ‰๊ณผ ๋ฌด์—‡์ด ๋‹ค๋ฅธ์ง€ ์˜๋ฌธ์ด ๋“ค๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.

์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋Š” O(n)์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ๋งค๋ฒˆ k๊ฐœ์˜ ์ ‘์‹œ๋ฅผ ๋ชจ๋‘ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

- ๋ฐฉ๊ธˆ ๋บ€ ์Šค์‹œ์˜ ์ข…๋ฅ˜๊ฐ€ ๋” ์ด์ƒ ์œˆ๋„์šฐ์— ์—†์œผ๋ฉด count-=1

- ๋ฐฉ๊ธˆ ์ƒˆ๋กœ ๋“ค์–ด์˜จ ์Šค์‹œ์˜ ์ข…๋ฅ˜๊ฐ€ ์›๋ž˜ ์œˆ๋„์šฐ์— ์—†๋˜ ๊ฒƒ์ด๋ฉด count+=1

- ํ˜„์žฌ์˜ ์œˆ๋„์šฐ ์•ˆ์— c๋ฒˆ(์ฟ ํฐ)์Šค์‹œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ count+=1

ํ•ด์„œ ์ด์ „ ์œˆ๋„์šฐ์˜ count๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ๋” ํฐ๊ฐ’์œผ๋กœ ์œ ์ง€์‹œ์ผœ์„œ ๋๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉด ๋œ๋‹ค.

ํ•œ ์œˆ๋„์šฐ ๋‚ด์˜ ์—ฐ์‚ฐ์ด ์ƒ์ˆ˜๋ฒˆ์œผ๋กœ ๋๋‚˜๊ธฐ ๋•Œ๋ฌธ์— O(n)์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด๋‹ค. 

 

์œˆ๋„์šฐ๋Š” ๊ณ„์† ๋งจ ์•ž์— ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๋งจ ๋’ค์— ๋‹ค๋ฅธ ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์—ฐ์‚ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— C++ STL queue ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. 

 

[์ตœ์ข… ์ฝ”๋“œ]

#include <stdio.h>
#include <algorithm> //max()๋ฅผ ์œ„ํ•œ ํ—ค๋”ํŒŒ์ผ 
#include <queue>
#include <memory.h> //memset์„ ๋ฐฑ์ค€์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ—ค๋”ํŒŒ์ผ
using namespace std;

int n, d, k, c;
int belt[3000000]; 
int kind[3000]; 
int i, j;
queue<int> window;

int slidingWindow() {
	int maxcount;
	int count = 0;
	int temp;
	for (int i = 0;i < k;i++) {
		temp = belt[i];
		window.push(temp);
		if (kind[temp - 1] == 0)
			count++;
		kind[temp - 1]++;
	}
	if (kind[c - 1] == 0)
		maxcount = count + 1;
	else
		maxcount = count;
	for (int i = k;i < n+k;i++) {
		int tempcount = count;
		//๋งจ ์•ž์— ์žˆ๋˜ ์ ‘์‹œ ํ™•์ธ ํ›„ ์ œ๊ฑฐ
		int front = window.front();
		kind[front - 1]--;
		if (kind[front-1]==0)
			tempcount--;
		window.pop();

		//์ƒˆ๋กœ์šด ์ ‘์‹œ ์ถ”๊ฐ€ 
		temp = belt[i%n];
		window.push(temp);
		if (kind[temp - 1] == 0)
			tempcount++;
		kind[temp - 1]++;
		//์ฟ ํฐ ์ดˆ๋ฐฅ์„ ์•„์ง ๋จน์ง€ ์•Š์•˜์„ ๋•Œ 
		if (kind[c - 1] == 0)
			maxcount=max(maxcount,tempcount+1);
		else
			maxcount = max(maxcount, tempcount);
	
		count = tempcount;
	}
	return maxcount;
}
int main() {
	memset(belt, 0, sizeof(belt));
	scanf_s("%d", &n);
	scanf_s("%d", &d);
	scanf_s("%d", &k);
	scanf_s("%d", &c);
	for (int i = 0;i < n;i++) {
		scanf_s("%d", &belt[i]);
	}
	printf("%d", slidingWindow());
}

[๊ณ ๋ คํ•  ์ ]

1. slidingWindow()์—์„œ for๋ฌธ์„ ๋Œ๋ฆด ๋•Œ, k~n-1๊นŒ์ง€๊ฐ€ ์•„๋‹ˆ๋ผ, n~n+k-1(n๋ฒˆ)๋Œ๋ ค์•ผ ํ•˜๋Š” ์ ์ด ์ค‘์š”

2. ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฐ์—ด์€ ์ฒ˜์Œ๊ณผ ๋์ด ์žˆ๋Š” ๋ชจ์–‘์ด์ง€๋งŒ, ์‹ค์ œ๋กœ ๋ฒจํŠธ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— belt[i%n]๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”

3. ์ฟ ํฐ ์ดˆ๋ฐฅ์„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด๋จน์–ด์•ผ ํ•˜๋Š”์ง€ ์•„๋‹Œ์ง€๋Š” ๋งค window๋งˆ๋‹ค ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, tempcount์— ๋”ํ•ด๋ฒ„๋ ค์„œ ๋„˜๊ธฐ๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ window๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜์— ๋”ํ•˜์ง€ ๋ง๊ณ  if๋ฌธ์„ ์ด์šฉํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด์•ผํ•จ

if (kind[c - 1] == 0)
    maxcount=max(maxcount,tempcount+1);
else
    maxcount = max(maxcount, tempcount);
count = tempcount;

์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ชฐ๋ž์œผ๋ฉด, ์ดํ‹€๋ฐค์„ ์ƒˆ๋„ ํ’€์ง€ ๋ชปํ–ˆ์„ ๊ฒƒ ๊ฐ™์€ ๋ฌธ์ œ์˜€๋‹ค. 

๋ฐ˜์‘ํ˜•