๐Ÿ•๏ธ ICPC Sinchon/Linear Data Structure

[BOJ][C++] ๋ฐฑ์ค€ 1966๋ฒˆ: ํ”„๋ฆฐํ„ฐ ํ

์„ ๋‹ฌ 2023. 11. 7. 18:52
๋ฐ˜์‘ํ˜•

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 ์ดํ•˜์˜ ์ •์ˆ˜์ด๊ณ , ์ค‘์š”๋„๊ฐ€ ๊ฐ™์€ ๋ฌธ์„œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค.

์ถœ๋ ฅ

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

 

ํ’€์ด

๋ฌธ์ œ์—๋Š” ํ๋ผ๊ณ  ๋˜์–ด์žˆ์ง€๋งŒ ๋ฌธ์ œ์ฒ˜๋Ÿผ ์•ž์œผ๋กœ ๊บผ๋‚ด์„œ ๋’ค๋กœ ๋ณด๋‚ด๋Š” ์ž‘์—…์„ ํ•  ๋•Œ ํ•„์ž๋Š” ๋ฑ์„ ์‚ฌ์šฉํ–ˆ๋‹ค (ํ๋ฅผ ์ด์šฉํ•ด๋„ ๋ฌด๋ฐฉ)

 

์ด๋•Œ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋งจ์ฒ˜์Œ์— ๋ช‡๋ฒˆ์งธ ๋ฌธ์„œ์˜€๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜์—†๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์—

์ž…๋ ฅ์„ ๋ฐ›์•„ ํ์— ๋„ฃ์„ ๋•Œ pair ํƒ€์ž…์„ ์ด์šฉํ•˜์—ฌ ๋ช‡๋ฒˆ์งธ ์ธ์ง€๋ฅผ ํ•จ๊ป˜ ๋„ฃ์–ด์คฌ๋‹ค

d[i] = {a,b} -> ๊ฐ€์ค‘์น˜๊ฐ€ a์ธ b๋ฒˆ์งธ ๋ฌธ์„œ

  

๊ทธ๋ฆฌ๊ณ  ์ž…๋ ฅ๋ฐ›์€ ๊ฐ€์ค‘์น˜๋“ค์„ ๋ฒกํ„ฐ์— ํ•จ๊ป˜ ๋„ฃ๊ณ  ์ด๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ๊ฐ€์ค‘์น˜๋“ค์„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์–ป์—ˆ๋‹ค

typedef pair<int,int> ci;

int main() {
    int t;
    cin >> t;
    while(t--) {
        int n, m;
        cin >> n >> m;
        deque<ci>d;
        vector<int> value;
        for(int i=0; i<n; i++) {
            int input;
            cin >> input;
            d.push_back({input, i});
            value.push_back(input);
        }

 

์ด์ œ ์ด ๋ฒกํ„ฐ๋ฅผ ๋Œ๋ฉด์„œ ํ˜„์žฌ ๊ฐ€์ค‘์น˜(ํ˜„์žฌ ๊ฐ€์ค‘์น˜ ์ค‘ ์ตœ๋Œ“๊ฐ’)์™€ ๊ฐ™์€ ๊ฐ’์ด ํ์˜ front์— ์˜ฌ ๋•Œ๊นŒ์ง€ ๋Œ๋ฆฐ๋‹ค

๋ณธ๊ฒฉ์ ์œผ๋กœ ๋ฌธ์ œ์— ๋‚˜์˜จ ํ”„๋ฆฐํ„ฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค

        for(int i=0; i<n; i++) {
            while(d.front().first != value[i]) {
                ci tmp = d.front();
                d.push_back(tmp);
                d.pop_front();
            }

 

๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ์ตœ๋Œ€ ๊ฐ€์ค‘์น˜๊ฐ€ ๋งจ ์•ž์— ์˜ค๋ฉด ๋Œ๋ฆฌ๋Š”๊ฑธ ๋ฉˆ์ถ”๊ณ  ์ธ์‡„(d.pop_front())ํ•œ๋‹ค

์ด๋•Œ ์ธ์‡„ํ•œ ๋ฌธ์„œ์˜ ๋ฒˆํ˜ธ = d.front().second ๊ฐ€ m๊ณผ ๊ฐ™์œผ๋ฉด ์ฒ˜์Œ m๋ฒˆ์งธ ๋ฌธ์„œ๊ฐ€ ์ธ์‡„๋˜๋Š”๊ฑฐ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค

๊ทธ๋Ÿผ ํ˜„์žฌ์˜ ์ธ์‡„ ์ˆœ์„œ๋ฅผ ans์— ๋„ฃ๊ณ  ๋งˆ์ง€๋ง‰์— ์ถœ๋ ฅํ•˜๋ฉด ๋˜๊ฒ ๋‹ค

            ci tmp = d.front();
            d.pop_front();
            if(tmp.second == m) {
                ans = i+1;
            }
        }

 

 

์ฝ”๋“œ

// ํ’€์ด : https://whkakrkr.tistory.com

#include <iostream>
#include <deque>
#include <vector>
#include <algorithm>

using namespace std;

typedef pair<int,int> ci;

int main() {
    int t;
    cin >> t;
    while(t--) {
        int n, m;
        cin >> n >> m;
        deque<ci>d;
        vector<int> value;
        for(int i=0; i<n; i++) {
            int input;
            cin >> input;
            d.push_back({input, i});
            value.push_back(input);
        }
        
        int ans;
        sort(value.begin(), value.end(), greater<>());
        for(int i=0; i<n; i++) {
            while(d.front().first != value[i]) {
                ci tmp = d.front();
                d.push_back(tmp);
                d.pop_front();
            }
            ci tmp = d.front();
            d.pop_front();
            if(tmp.second == m) {
                ans = i+1;
            }
        }
        
        cout << ans << "\n";
        
    }
}
๋ฐ˜์‘ํ˜•