๐•ƒ๐•ฆ๐•„๐•š๐•ฃ

ใ€ŒโŒจ๏ธแด„sใ€PS/๋ฐฑ์ค€_์ž๋ฃŒ๊ตฌ์กฐ[DS]

[Baekjoon/๋ฐฑ์ค€][11003][C/C++] ์ตœ์†Ÿ๊ฐ’ ์ฐพ๊ธฐ

by ๋ฃจ๋ฐ€๐•ƒ๐•ฆ๐•„๐•š๐•ฃ2023. 5. 5.
728x90
๋ฐ˜์‘ํ˜•
ใ€Ž๋ชฉ์ฐจใ€
0. ๊ฐœ์š”

1. ๋ฌธ์ œ
2. ํ’€์ด
3. ์ฝ”๋“œ

0. ๊ฐœ์š”

์ž๋ฃŒ๊ตฌ์กฐ, ์šฐ์„ ์ˆœ์œ„ ํ, ๋ฑ ๋ฌธ์ œ.

1. ๋ฌธ์ œ

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

 

11003๋ฒˆ: ์ตœ์†Ÿ๊ฐ’ ์ฐพ๊ธฐ

N๊ฐœ์˜ ์ˆ˜ A1, A2, ..., AN๊ณผ L์ด ์ฃผ์–ด์ง„๋‹ค. Di = Ai-L+1 ~ Ai ์ค‘์˜ ์ตœ์†Ÿ๊ฐ’์ด๋ผ๊ณ  ํ•  ๋•Œ, D์— ์ €์žฅ๋œ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์ด๋•Œ, i ≤ 0 ์ธ Ai๋Š” ๋ฌด์‹œํ•˜๊ณ  D๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

www.acmicpc.net

[๋ฌธ์ œ]

N๊ฐœ์˜ ์ˆ˜ A1, A2, ..., AN๊ณผ L์ด ์ฃผ์–ด์ง„๋‹ค.

Di = Ai-L+1 ~ Ai ์ค‘์˜ ์ตœ์†Ÿ๊ฐ’์ด๋ผ๊ณ  ํ•  ๋•Œ, D์— ์ €์žฅ๋œ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์ด๋•Œ, i ≤ 0 ์ธ Ai๋Š” ๋ฌด์‹œํ•˜๊ณ  D๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

[์ž…๋ ฅ]

์ฒซ์งธ ์ค„์— N๊ณผ L์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ L ≤ N ≤ 5,000,000)

๋‘˜์งธ ์ค„์—๋Š” N๊ฐœ์˜ ์ˆ˜ Ai๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (-109 ≤ Ai ≤ 109)

[์ถœ๋ ฅ]

์ฒซ์งธ ์ค„์— Di๋ฅผ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

[์˜ˆ์ œ ์ž…๋ ฅ 1]

12 3
1 5 2 3 6 2 3 7 3 5 2 6

[์˜ˆ์ œ ์ถœ๋ ฅ 1]

1 1 1 2 2 2 2 2 3 3 2 2
๋ฐ˜์‘ํ˜•

2. ํ’€์ด

์ด ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ๋Š”

1. Sliding Window ์•Œ๊ณ ๋ฆฌ์ฆ˜.

2. Priority_queue๋ฅผ ์ž„์˜์˜ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•.

์œ„ ๋‘๊ฐ€์ง€์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

'Di = Ai-L+1 ~ Ai' ๋ผ๋Š” ๋ง์€ ๊ฒฐ๊ตญ, ๊ธธ์ด๊ฐ€ L์ธ ๋ถ€๋ถ„ ๊ตฌ๊ฐ„์—์„œ ์ฐพ์€ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋ผ๋Š” ๋ง์ธ๋ฐ, ์ด๋Š” ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค.

[Baekjoon/๋ฐฑ์ค€][11003][C/C++] ์ตœ์†Ÿ๊ฐ’ ์ฐพ๊ธฐ
[Baekjoon/๋ฐฑ์ค€][11003][C/C++] ์ตœ์†Ÿ๊ฐ’ ์ฐพ๊ธฐ

[Navieํ•œ ํ’€์ด] : ์œ„ ๋‚ด์šฉ์„ Naive ํ•˜๊ฒŒ ํ’€๊ฒŒ ๋˜๋ฉด, $O(NL)$์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์†Œ์š”๋œ๋‹ค. ์ด๋Š” ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์›์ธ์ด ๋œ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ์‚ฝ์ž… : $O(1)$

์ตœ์†Ÿ๊ฐ’ ์ฐพ๊ธฐ : $O(L)$

์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ : $O(1)$

 

[Priority Queue๋ฅผ ์ด์šฉํ•œ ํ’€์ด] : $O(NlogL)$

์ปจํ…Œ์ด๋„ˆ ์‚ฝ์ž… : $O(logL)$

์ตœ์†Ÿ๊ฐ’ ์ฐพ๊ธฐ : $O(1)$

์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ : $O(logL)$

 

ํ•ต์‹ฌ ๋กœ์ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

cmp๋ฅผ ํ†ตํ•ด val ๊ฐ’์ด ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๋ฅผ priority_queue์˜ ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค.

(val ๊ฐ’์ด ๋™์ผํ•˜๋‹ค๋ฉด, ๊ฐ€์žฅ ๋Šฆ๊ฒŒ ๋“ค์–ด์˜จ ์›์†Œ, ์ฆ‰ idx๊ฐ’์ด ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๊ฐ€ ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•œ๋‹ค.)

์ดํ›„, ์ตœ์†Ÿ๊ฐ’์˜ idx๋ฅผ ํ™•์ธํ•˜๋Š”๋ฐ, ์ตœ์†Ÿ๊ฐ’์˜ idx๊ฐ€ sliding window์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๋ฒ”์œ„๋ผ๋ฉด (idx - L ๋ณด๋‹ค ๊ทธ ๊ฐ’์ด ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด) priority_queue์—์„œ ์ œ๊ฑฐํ•œ๋‹ค. while๋ฌธ์„ ํ†ตํ•ด ํ•ด๋‹น ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๊ฒฐ๊ตญ priority_queue์˜ ์ตœ์ƒ๋‹จ์—๋Š” sliding window์˜ ๋ฒ”์œ„์— ํฌํ•จ๋˜๋Š” ์›์†Œ ์ค‘ ์ตœ์†Ÿ๊ฐ’์ด ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค.

3. ์ฝ”๋“œ

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;

struct cmp { //priority_queue๋ฅผ ์œ„ํ•œ ๋น„๊ต ํ•จ์ˆ˜.
	bool operator()(const pair<int, int>& a, const pair<int, int>& b) {
		if (a.second != b.second)
			return a.second > b.second; //val ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ.
		else
			return a.first > b.first; //idx ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ.
	}
};

int main(int argc, char* argv[]) {
	/* Faster */
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	/* Init */
	priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> pq; //idx, val
	
	/* Input */
	int n, l; cin >> n >> l;
	for (int idx = 0; idx < n; idx++) {
		/* Input */
		int val; cin >> val;
		
		/* Logic */
		pq.push(make_pair(idx, val));

		while (pq.top().first <= idx - l)
			pq.pop();

		/* Output */
		cout << pq.top().second << ' ';
	}

	/* Return */
	return 0;
}

/* 
Sliding Window ์•Œ๊ณ ๋ฆฌ์ฆ˜.

Priority Queue ์ด์šฉ.

[naive ํ’€์ด]
์ปจํ…Œ์ด๋„ˆ ์‚ฝ์ž… : O(1)
์ตœ์†Ÿ๊ฐ’ ์ฐพ๊ธฐ : O(L)
์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ : O(1)

[priority_queue ์ด์šฉ ํ’€์ด]
์ปจํ…Œ์ด๋„ˆ ์‚ฝ์ž… : O(logL)
์ตœ์†Ÿ๊ฐ’ ์ฐพ๊ธฐ : O(1)
์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ : O(logL)
*/
728x90
๋ฐ˜์‘ํ˜•