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

[Baekjoon/๋ฐฑ์ค€][1966][C/C++] ํ”„๋ฆฐํ„ฐ ํ

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

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

0. ๊ฐœ์š”

๊ตฌํ˜„, ์ž๋ฃŒ๊ตฌ์กฐ, ์‹œ๋ฎฌ๋ ˆ์ด์…˜, ํ ๋ฌธ์ œ. ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•„์ž๋Š” ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœ ํ๋งŒ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•œ ๋‹ค๋ฅธ ๋ถ„์˜ ํ’€์ด๋„ ํ•จ๊ป˜ ์ฒจ๋ถ€ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

1. ๋ฌธ์ œ

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

 

1966๋ฒˆ: ํ”„๋ฆฐํ„ฐ ํ

์—ฌ๋Ÿฌ๋ถ„๋„ ์•Œ๋‹ค์‹œํ”ผ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋ฆฐํ„ฐ ๊ธฐ๊ธฐ๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ์ธ์‡„ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์„œ๋ฅผ ์ธ์‡„ ๋ช…๋ น์„ ๋ฐ›์€ ‘์ˆœ์„œ๋Œ€๋กœ’, ์ฆ‰ ๋จผ์ € ์š”์ฒญ๋œ ๊ฒƒ์„ ๋จผ์ € ์ธ์‡„ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฌธ์„œ๊ฐ€ ์Œ“์ธ๋‹ค๋ฉด Queue ์ž๋ฃŒ๊ตฌ์กฐ์—

www.acmicpc.net

[๋ฌธ์ œ]

์—ฌ๋Ÿฌ๋ถ„๋„ ์•Œ๋‹ค์‹œํ”ผ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋ฆฐํ„ฐ ๊ธฐ๊ธฐ๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ์ธ์‡„ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์„œ๋ฅผ ์ธ์‡„ ๋ช…๋ น์„ ๋ฐ›์€ ‘์ˆœ์„œ๋Œ€๋กœ’, ์ฆ‰ ๋จผ์ € ์š”์ฒญ๋œ ๊ฒƒ์„ ๋จผ์ € ์ธ์‡„ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฌธ์„œ๊ฐ€ ์Œ“์ธ๋‹ค๋ฉด Queue ์ž๋ฃŒ๊ตฌ์กฐ์— ์Œ“์—ฌ์„œ FIFO - First In First Out - ์— ๋”ฐ๋ผ ์ธ์‡„๊ฐ€ ๋˜๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ƒ๊ทผ์ด๋Š” ์ƒˆ๋กœ์šด ํ”„๋ฆฐํ„ฐ๊ธฐ ๋‚ด๋ถ€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜์˜€๋Š”๋ฐ, ์ด ํ”„๋ฆฐํ„ฐ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ธ์‡„๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค.

  1. ํ˜„์žฌ Queue์˜ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๋ฌธ์„œ์˜ ‘์ค‘์š”๋„’๋ฅผ ํ™•์ธํ•œ๋‹ค.
  2. ๋‚˜๋จธ์ง€ ๋ฌธ์„œ๋“ค ์ค‘ ํ˜„์žฌ ๋ฌธ์„œ๋ณด๋‹ค ์ค‘์š”๋„๊ฐ€ ๋†’์€ ๋ฌธ์„œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋‹ค๋ฉด, ์ด ๋ฌธ์„œ๋ฅผ ์ธ์‡„ํ•˜์ง€ ์•Š๊ณ  Queue์˜ ๊ฐ€์žฅ ๋’ค์— ์žฌ๋ฐฐ์น˜ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋ฐ”๋กœ ์ธ์‡„๋ฅผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Queue์— 4๊ฐœ์˜ ๋ฌธ์„œ(A B C D)๊ฐ€ ์žˆ๊ณ , ์ค‘์š”๋„๊ฐ€ 2 1 4 3 ๋ผ๋ฉด C๋ฅผ ์ธ์‡„ํ•˜๊ณ , ๋‹ค์Œ์œผ๋กœ D๋ฅผ ์ธ์‡„ํ•˜๊ณ  A, B๋ฅผ ์ธ์‡„ํ•˜๊ฒŒ ๋œ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์ด ํ•  ์ผ์€, ํ˜„์žฌ Queue์— ์žˆ๋Š” ๋ฌธ์„œ์˜ ์ˆ˜์™€ ์ค‘์š”๋„๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์–ด๋–ค ํ•œ ๋ฌธ์„œ๊ฐ€ ๋ช‡ ๋ฒˆ์งธ๋กœ ์ธ์‡„๋˜๋Š”์ง€ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ ์˜ˆ์—์„œ C๋ฌธ์„œ๋Š” 1๋ฒˆ์งธ๋กœ, A๋ฌธ์„œ๋Š” 3๋ฒˆ์งธ๋กœ ์ธ์‡„๋˜๊ฒŒ ๋œ๋‹ค.

[์ž…๋ ฅ]

์ฒซ ์ค„์— ํ…Œ์ŠคํŠธ์ผ€์ด์Šค์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋Š” ๋‘ ์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

ํ…Œ์ŠคํŠธ์ผ€์ด์Šค์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ๋ฌธ์„œ์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 100)๊ณผ, ๋ช‡ ๋ฒˆ์งธ๋กœ ์ธ์‡„๋˜์—ˆ๋Š”์ง€ ๊ถ๊ธˆํ•œ ๋ฌธ์„œ๊ฐ€ ํ˜„์žฌ Queue์—์„œ ๋ช‡ ๋ฒˆ์งธ์— ๋†“์—ฌ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ M(0 ≤ M < N)์ด ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ ๋งจ ์™ผ์ชฝ์€ 0๋ฒˆ์งธ๋ผ๊ณ  ํ•˜์ž. ๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” N๊ฐœ ๋ฌธ์„œ์˜ ์ค‘์š”๋„๊ฐ€ ์ฐจ๋ก€๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ค‘์š”๋„๋Š” 1 ์ด์ƒ 9 ์ดํ•˜์˜ ์ •์ˆ˜์ด๊ณ , ์ค‘์š”๋„๊ฐ€ ๊ฐ™์€ ๋ฌธ์„œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค.

[์ถœ๋ ฅ]

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ๋ฌธ์„œ๊ฐ€ ๋ช‡ ๋ฒˆ์งธ๋กœ ์ธ์‡„๋˜๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค.

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

3
1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1

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

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

2. ํ’€์ด

/* ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š์€ ํ’€์ด */

ํ’€์ด์˜ ๋กœ์ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์•„๋ž˜์˜ ๋กœ์ง์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

[Baekjoon/๋ฐฑ์ค€][1966][C/C++] ํ”„๋ฆฐํ„ฐ ํ
[Baekjoon/๋ฐฑ์ค€][1966][C/C++] ํ”„๋ฆฐํ„ฐ ํ

 

/* ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•œ ํ’€์ด */

์šฐ์„ ์ˆœ์œ„ ํ๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ๋จผ์ € ์‚ญ์ œํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

์šฐ์„ ์ˆœ์œ„ ํ๋Š” ๋ฐฐ์—ด, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ, ํž™ ๋“ฑ์œผ๋กœ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•œ๋ฐ, ์ด ์ค‘์—์„œ ํž™(heap)์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํšจ์œจ์ ์ด๋‹ค.

ํž™์€ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์˜ ์ผ์ข…์œผ๋กœ, ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. 

์ด๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’๋“ค ์ค‘์—์„œ ์ตœ๋Œ“๊ฐ’์ด๋‚˜ ์ตœ์†Ÿ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ง„ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.
ํž™์€ ์ผ์ข…์˜ ๋ฐ˜์ •๋ ฌ ์ƒํƒœ (๋Š์Šจํ•œ ์ •๋ ฌ ์ƒํƒœ)๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

๋‹ค์‹œ ๋งํ•ด, ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ํ•ญ์ƒ ์ž‘๊ฑฐ๋‚˜ ํฐ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. 

ํž™์—์„œ๋Š” ์ค‘๋ณต๋œ ๊ฐ’์„ ํ—ˆ์šฉํ•œ๋‹ค.

์ตœ๋Œ€ ํž™(max heap)
"๋ถ€๋ชจ ๋…ธ๋“œ์˜ key ๊ฐ’ >= ์ž์‹ ๋…ธ๋“œ์˜ key ๊ฐ’"์„ ๋งŒ์กฑํ•˜๋Š” ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ

์ตœ์†Œ ํž™(min heap)
"๋ถ€๋ชจ ๋…ธ๋“œ์˜ key ๊ฐ’ =< ์ž์‹ ๋…ธ๋“œ์˜ key ๊ฐ’"์„ ๋งŒ์กฑํ•˜๋Š” ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ

์ด ๋ฌธ์ œ์—์„œ๋Š” ์ค‘์š”๋„๊ฐ€ ๋†’์€ ๋ฌธ์„œ์ผ์ˆ˜๋ก ๊ฐ€์žฅ ๋จผ์ € ์ธ์‡„ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ตœ๋Œ€ ํž™์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค!

3. ์ฝ”๋“œ

/* ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š์€ ํ’€์ด */
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;

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

	/* Input */
	int T; cin >> T;
	for (int i = 0; i < T; i++) {
		/* Input */
		int N, M; cin >> N >> M;

		/* Init */
		int arr[10] = {};
		queue<pair<int, bool>> q;
		bool flag = false; //๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœ์„ ์œ„ํ•œ flag ๋ณ€์ˆ˜

		for (int j = 0; j < N; j++) {
			int elem; cin >> elem;

			arr[elem]++;
			q.push(make_pair(elem, j == M));
		}

		/* Calculate */
		for (int j = 9; j >= 0; j--) {
			while (arr[j] > 0) {
				if (j == q.front().first) {
					if (q.front().second == true) {
						cout << N - q.size() + 1 << '\n';
						flag = true;
						break;
					}

					q.pop();
					arr[j]--;
				}
				else { // j != q.front().first
					q.push(q.front());
					q.pop();
				}
			}

			if (flag == true)
				break;
		}
	}

	/* End */
	return 0;
}

/*

//debug
for (int j = 0; j < 10; j++) {
	cout.width(3);
	cout << j << ' ';
}
cout << '\n';
for (int j = 0; j < 10; j++) {
	cout.width(3);
	cout << arr[j] << ' ';
}
cout << '\n';

while (!q.empty()) {
	cout.width(3);
	cout << q.front().first << '&' << q.front().second << ' ';
	q.pop();
}
cout << '\n';

*/
/* ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•œ ํ’€์ด */
#include<iostream>
#include<queue>
using namespace std;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int t;
    cin >> t;

	while(t--){
        int n, m;
        cin >> n >> m;
        
        // ์ธ๋ฑ์Šค๊ฐ€ m์ธ ๋ฌธ์„œ๊ฐ€ ๋ช‡๋ฒˆ์งธ๋กœ ์ธ์‡„๋˜์—ˆ๋Š”์ง€ ์นด์šดํŒ…ํ•˜๋Š” ๋ณ€์ˆ˜
        int cnt = 0;

        queue<pair<int, int>> q;
        priority_queue<int> pq; // ๊ธฐ๋ณธ์ ์œผ๋กœ ์ตœ๋Œ€ ํž™ 

        for (int i = 0; i < n; i++){
			int x; 
			cin >> x; 
			
            q.push({ i, x }); // ์ธ๋ฑ์Šค์™€ ์ค‘์š”๋„ 
            pq.push(x); // ์ค‘์š”๋„๊ฐ€ ๋†’์€ ์ˆœ์œผ๋กœ 
        }

        while (!q.empty()){
            // ํ์˜ front ์›์†Œ๋ฅผ ๊บผ๋‚ด์„œ
            int idx = q.front().first;
            int priority = q.front().second;
            q.pop();

            // ์šฐ์„ ์ˆœ์œ„ ํ์˜ top๊ณผ ์ค‘์š”๋„๊ฐ€ ์ผ์น˜ํ•˜๋ฉด
            if (pq.top() == priority){
                pq.pop();
                cnt++; // ๋ฌธ์„œ ํ•˜๋‚˜ ์ธ์‡„ํ•  ๋•Œ๋งˆ๋‹ค ์ฆ๊ฐ€

                // ํ˜„์žฌ ๋ฌธ์„œ์˜ ์ธ๋ฑ์Šค๊ฐ€ m์ธ ๊ฒฝ์šฐ
                if (idx == m){
                    // ๋ช‡๋ฒˆ์งธ๋กœ ์ธ์‡„๋˜์—ˆ๋Š”์ง€ ์ถœ๋ ฅ
                    cout << cnt << '\n'; 
                    break; // ๊ทธ ๋‹ค์Œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋กœ ๋„˜์–ด๊ฐ€๊ธฐ
                }
            }
            else { 
				// ์ค‘์š”๋„๊ฐ€ ๋†’์ง€ ์•Š์œผ๋ฉด ํ์˜ rear์— ๋‹ค์‹œ push
                q.push({ idx, priority });
            }
        }

        // ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค q, pq๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— 
        // ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™”๋Š” ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.  
    }

    return 0;
}
728x90
๋ฐ˜์‘ํ˜•