๐Ÿ’ป

[๋ฐฑ์ค€] ์šฐ์„ ์ˆœ์œ„ํ - 1966. ํ”„๋ฆฐํ„ฐํ ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฌธ์ œํ’€์ด Baekjoon

[๋ฐฑ์ค€] ์šฐ์„ ์ˆœ์œ„ํ - 1966. ํ”„๋ฆฐํ„ฐํ

๋˜ํšจ๋‹ˆ 2020. 11. 12. 12:46

www.acmicpc.net/problem/1966

 

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

์ฒซ ์ค„์— test case์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ test case์— ๋Œ€ํ•ด์„œ ๋ฌธ์„œ์˜ ์ˆ˜ N(100์ดํ•˜)์™€ ๋ช‡ ๋ฒˆ์งธ๋กœ ์ธ์‡„๋˜์—ˆ๋Š”์ง€ ๊ถ๊ธˆํ•œ ๋ฌธ์„œ๊ฐ€ ํ˜„์žฌ Queue์˜ ์–ด๋–ค ์œ„์น˜์— ์žˆ๋Š”์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” M(0์ด์ƒ N๋ฏธ๋งŒ)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ

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๋ฒˆ์งธ๋กœ ์ธ์‡„๋˜๊ฒŒ ๋œ๋‹ค.

์ž…๋ ฅ

์ฒซ ์ค„์— test case์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ test case์— ๋Œ€ํ•ด์„œ ๋ฌธ์„œ์˜ ์ˆ˜ N(100์ดํ•˜)์™€ ๋ช‡ ๋ฒˆ์งธ๋กœ ์ธ์‡„๋˜์—ˆ๋Š”์ง€ ๊ถ๊ธˆํ•œ ๋ฌธ์„œ๊ฐ€ ํ˜„์žฌ Queue์˜ ์–ด๋–ค ์œ„์น˜์— ์žˆ๋Š”์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” M(0์ด์ƒ N๋ฏธ๋งŒ)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ์ค„์— N๊ฐœ ๋ฌธ์„œ์˜ ์ค‘์š”๋„๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ, ์ค‘์š”๋„๋Š” 1 ์ด์ƒ 9 ์ดํ•˜์ด๋‹ค. ์ค‘์š”๋„๊ฐ€ ๊ฐ™์€ ๋ฌธ์„œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์œ„์˜ ์˜ˆ๋Š” N=4, M=0(A๋ฌธ์„œ๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด), ์ค‘์š”๋„๋Š” 2 1 4 3์ด ๋œ๋‹ค.

์ถœ๋ ฅ

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

์˜ˆ์ œ ์ž…๋ ฅ 1 ๋ณต์‚ฌ

3

1 0 

5

4 2

1 2 3 4

6 0

1 1 9 1 1 1

์˜ˆ์ œ ์ถœ๋ ฅ 1 ๋ณต์‚ฌ

1

2

5

 

ํ’€์ด

์šฐ์„ ์ˆœ์œ„ํ๋ฅผ ์‚ฌ์šฉํ•  ์ƒ๊ฐ์„ ๋ชปํ•˜๊ณ  ์ฒ˜์Œ์— map์„ ์ด์šฉํ•ด์„œ ํ’€๋ ค๊ณ  ํ–ˆ๋‹ค.

์šฐ์„ ์ˆœ์œ„ํ ๋ฌธ์ œ๋ฅผ ์ž์ฃผ ์ ‘ํ•˜์ง€ ๋ชปํ•˜๋‹ค๋ณด๋‹ˆ ์ž๊พธ ๊นŒ๋จน๋Š” ๋“ฏ ์‹ถ๋‹ค.

 

์šฐ์„ ์ˆœ์œ„ํ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์›์†Œ๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ๋กœ ๊ธฐ๋ณธ์ •๋ ฌ๋œ๋‹ค.

priority_queue<int, vector<int> > pq; //์ž๋ฃŒํ˜• int, ์ปจํ…Œ์ด๋„ˆ vector, ๊ธฐ๋ณธ๊ฐ’์€ ๋‚ด๋ฆผ์ฐจ์ˆœ

 

ํ์™€ ์šฐ์„ ์ˆœ์œ„ํ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด

 

3 0

1 2 5

 

๋ผ๊ณ  ์ฃผ์–ด์ง„๋‹ค๋ฉด

 

q   : 0, 1 / 1, 2 /  2, 5

pq :  5 / 2 / 1

 

์ด๋ ‡๊ฒŒ ์›์†Œ๊ฐ€ ๋“ค์–ด๊ฐ€์ง€๊ณ  while๋ฌธ์„ ๋Œ๋ฉด์„œ q์˜ ์›์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ pq์˜ top์ด๋ž‘ ๋น„๊ตํ•˜๊ณ  ๊ฐ™์œผ๋ฉด pq์—์„œ popํ•œ๋‹ค. ์ด๋•Œ, index์˜ ๊ฐ’์ด M๊ณผ ๊ฐ™์œผ๋ฉด ์ฐพ์œผ๋ ค๋Š” ์œ„์น˜์ด๋ฏ€๋กœ ์ถœ๋ ฅํ•ด์ฃผ๊ณ  break๋ฌธ์œผ๋กœ ๋น ์ ธ๋‚˜๊ฐ„๋‹ค. ๋งŒ์•ฝ, ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด ๋‹ค์‹œ q์— ๋„ฃ์–ด์ค€๋‹ค.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//1966. ํ”„๋ฆฐํ„ฐํ
#include <iostream>
#include <algorithm>
#include <queue>
 
using namespace std;
 
// ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•˜๊ณ  ์‹ถ์„๋•Œ(greater ์‚ฌ์šฉ๋„ ๊ฐ€๋Šฅ)
// struct compare{
//     bool operator()(int a, int b){
//         return a < b;
//     }
// }
int main(){
    int test_case;
    cin >> test_case;
    vector<int> v;
    for(int i=0; i<test_case; i++){
        int N, M;
        cin >> N >> M;
 
        queue<pair<intint> >  q;
        priority_queue<intvector<int> > pq; //์ž๋ฃŒํ˜• int, ์ปจํ…Œ์ด๋„ˆ vector, ๊ธฐ๋ณธ๊ฐ’์€ ๋‚ด๋ฆผ์ฐจ์ˆœ
 
        for(int j=0; j<N; j++){
            int element;
            cin >> element;
            q.push(make_pair(j, element));
            pq.push(element);
        }
 
        int cnt = 0;
        while(!q.empty()){
            int index = q.front().first;
            int value = q.front().second;
            q.pop();
            if(pq.top() == value){
                pq.pop();
                cnt++;
                if(index == M){
                    cout << cnt << "\n";
                    break;
                }
            }else q.push(make_pair(index, value));
        }
    }
 
    return 0;
}
cs
๋ฐ˜์‘ํ˜•
Comments