๐ŸŒฒ Altu-Bitu/๊ตฌํ˜„&์‹œ๋ฎฌ๋ ˆ์ด์…˜

[BOJ S1][C++] ๋ฐฑ์ค€ 20923๋ฒˆ: ์ˆซ์ž ํ• ๋ฆฌ๊ฐˆ๋ฆฌ ๊ฒŒ์ž„

์„ ๋‹ฌ 2022. 9. 30. 00:59
๋ฐ˜์‘ํ˜•

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

 

20923๋ฒˆ: ์ˆซ์ž ํ• ๋ฆฌ๊ฐˆ๋ฆฌ ๊ฒŒ์ž„

์ฒซ์งธ ์ค„์—๋Š” ๋„๋„์™€ ์ˆ˜์—ฐ์ด๊ฐ€ ๊ฐ€์ง€๋Š” ์นด๋“œ์˜ ๊ฐœ์ˆ˜ $N$($ 1 \leq N \leq 30\,000$)๊ณผ ๊ฒŒ์ž„ ์ง„ํ–‰ ํšŸ์ˆ˜ $M$($ 1 \leq M \leq 2\,500\,000$)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ $N$๊ฐœ์˜ ์ค„์—๋Š” ๋„์–ด์“ฐ๊ธฐ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋„๋„์™€ ์ˆ˜์—ฐ

www.acmicpc.net

 

๋ฌธ์ œ

์ธ๊ฐ„์ด ๊ฐ€์žฅ ์‹ฌ์‹ฌํ•จ์„ ๋Š๋‚€๋‹ค๋Š” ์˜คํ›„ 1์‹œ 22๋ถ„, ๋„๋„์™€ ์ˆ˜์—ฐ์ด๋Š” ์ˆซ์ž ํ• ๋ฆฌ ๊ฐˆ๋ฆฌ ๊ฒŒ์ž„์„ ํ•˜๋ ค ํ•œ๋‹ค. ์ˆซ์ž ํ• ๋ฆฌ ๊ฐˆ๋ฆฌ ๊ฒŒ์ž„์˜ ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

[์ˆซ์ž ํ• ๋ฆฌ ๊ฐˆ๋ฆฌ ๊ฒŒ์ž„์˜ ๊ทœ์น™]

  1. ์ดˆ๊ธฐ์— ๋„๋„์™€ ์ˆ˜์—ฐ์ด๋Š” ๊ฐ๊ฐ N์žฅ์˜ ์นด๋“œ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฑ์„ ๋ฐฐ๋ถ„๋ฐ›๋Š”๋‹ค. ๊ฒŒ์ž„ ์‹œ์ž‘ ์‹œ ๊ทธ๋ผ์šด๋“œ๋Š” ๋น„์–ด์žˆ๋Š” ์ƒํƒœ์ด๋‹ค. 
    • ๋ฑ์€ ์ˆซ์ž๊ฐ€ ๋ณด์ด์ง€ ์•Š๊ฒŒ ์นด๋“œ๋ฅผ ๋’ค์ง‘์–ด ์Œ“์•„ ๋†“์€ ์นด๋“œ ๋”๋ฏธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋„๋„์™€ ์ˆ˜์—ฐ์ด๋Š” ์ž์‹ ์˜ ๋ฑ์„ ๊ฐ€์ง€๊ณ  ๊ฒŒ์ž„์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.
    • ๊ทธ๋ผ์šด๋“œ๋Š” ๋„๋„์™€ ์ˆ˜์—ฐ์ด๊ฐ€ ๊ฒŒ์ž„์„ ์ง„ํ–‰ํ•˜๋ฉฐ ์ž์‹ ์ด ๊ฐ€์ง„ ๋ฑ์—์„œ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ์นด๋“œ๋ฅผ ๋‚ด๋ ค๋†“๊ฒŒ ๋˜๋Š” ๋•…์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ผ์šด๋“œ์— ์นด๋“œ๋ฅผ ๋‚ด๋ ค๋†“์„ ๋•Œ๋Š” ์ž์‹ ์˜ ๊ทธ๋ผ์šด๋“œ์— ์นด๋“œ๋ฅผ ๋‚ด๋ ค๋†“์œผ๋ฉฐ, ๊ทธ๋ผ์šด๋“œ์— ์นด๋“œ ๋”๋ฏธ๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ๊ธฐ์กด์— ๋งŒ๋“ค์–ด์ง„ ์นด๋“œ ๋”๋ฏธ ์œ„๋กœ ์นด๋“œ๋ฅผ ๋‚ด๋ ค๋†“๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.
  2. ๋„๋„๋ฅผ ์‹œ์ž‘์œผ๋กœ ๋„๋„์™€ ์ˆ˜์—ฐ์ด๊ฐ€ ์ฐจ๋ก€๋Œ€๋กœ ๊ทธ๋ผ์šด๋“œ์— ์ž์‹ ์ด ๊ฐ€์ง„ ๋ฑ์—์„œ ๊ฐ€์žฅ ์œ„์— ์œ„์น˜ํ•œ ์นด๋“œ๋ฅผ ๊ทธ๋ผ์šด๋“œ์— ์ˆซ์ž๊ฐ€ ๋ณด์ด๋„๋ก ๋‚ด๋ ค๋†“๋Š”๋‹ค.
  3. ์ข…์„ ๋จผ์ € ์น˜๋Š” ์‚ฌ๋žŒ์ด ๊ทธ๋ผ์šด๋“œ์— ๋‚˜์™€ ์žˆ๋Š” ์นด๋“œ ๋”๋ฏธ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์ข…์„ ์น  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    • ๊ทธ๋ผ์šด๋“œ์— ๋‚˜์™€ ์žˆ๋Š” ๊ฐ๊ฐ์˜ ์นด๋“œ ๋”๋ฏธ์—์„œ ๊ฐ€์žฅ ์œ„์— ์œ„์น˜ํ•œ ์นด๋“œ์˜ ์ˆซ์ž ํ•ฉ์ด 5๊ฐ€ ๋˜๋Š” ์ˆœ๊ฐ„ ์ˆ˜์—ฐ์ด๊ฐ€ ์ข…์„ ์นœ๋‹ค. ๋‹จ, ์–ด๋Š ์ชฝ์˜ ๊ทธ๋ผ์šด๋“œ๋„ ๋น„์–ด์žˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค.
    • ๊ทธ๋ผ์šด๋“œ์— ๋‚˜์™€ ์žˆ๋Š” ๊ฐ๊ฐ์˜ ์นด๋“œ ๋”๋ฏธ์—์„œ ๊ฐ€์žฅ ์œ„์— ์œ„์น˜ํ•œ ์นด๋“œ์˜ ์ˆซ์ž๊ฐ€ 5๊ฐ€ ๋‚˜์˜ค๋Š” ์ˆœ๊ฐ„ ๋„๋„๊ฐ€ ์ข…์„ ์นœ๋‹ค.
  4. ์ข…์„ ์ณค๋‹ค๋ฉด, ์ƒ๋Œ€๋ฐฉ์˜ ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋Š” ์นด๋“œ ๋”๋ฏธ๋ฅผ ๋’ค์ง‘์–ด ์ž์‹ ์˜ ๋ฑ ์•„๋ž˜๋กœ ๊ทธ๋Œ€๋กœ ํ•ฉ์นœ ํ›„ ์ž์‹ ์˜ ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋Š” ์นด๋“œ ๋”๋ฏธ ์—ญ์‹œ ๋’ค์ง‘์–ด ์ž์‹ ์˜ ๋ฑ ์•„๋ž˜๋กœ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€ ํ•ฉ์นœ๋‹ค.
      • ์ข…์„ ์ณ์„œ ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋Š” ์นด๋“œ ๋”๋ฏธ๋ฅผ ๊ฐ€์ ธ๊ฐ€๋Š” ํ–‰์œ„๋Š” ๊ฒŒ์ž„์˜ ์ง„ํ–‰ ์ˆœ์„œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.
  5. โ€ŠM๋ฒˆ ์ง„ํ–‰ํ•œ ํ›„ ์ž์‹ ์˜ ๋ฑ์— ๋” ๋งŽ์€ ์นด๋“œ๋ฅผ ์ง€๋‹Œ ์‚ฌ๋žŒ์ด ์Šน๋ฆฌํ•˜๊ณ  M๋ฒˆ ์ง„ํ–‰ ํ›„ ๊ฐ์ž์˜ ๋ฑ์— ์žˆ๋Š” ์นด๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋น„๊ธด ๊ฒƒ์œผ๋กœ ๋ณธ๋‹ค. ๊ฒŒ์ž„ ์ง„ํ–‰ ๋„์ค‘ ์ž์‹ ์˜ ๋ฑ์— ์žˆ๋Š” ์นด๋“œ์˜ ์ˆ˜๊ฐ€ 0๊ฐœ๊ฐ€ ๋˜๋Š” ์ฆ‰์‹œ ์ƒ๋Œ€๋ฐฉ์ด ์Šน๋ฆฌํ•œ ๊ฒƒ์œผ๋กœ ๋ณธ๋‹ค. (๋‘˜ ์ค‘ ํ•œ ๋ช…์ด 2~4๋ฒˆ๊นŒ์ง€์˜ ๊ณผ์ •์„ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์„ 1๋ฒˆ ์ง„ํ–‰ํ•œ ๊ฒƒ์œผ๋กœ ๋ณธ๋‹ค.)

๊ฒŒ์ž„์„ M๋ฒˆ ์ง„ํ–‰ํ•œ ํ›„ ์Šน๋ฆฌํ•œ ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ์ผ๊นŒ?

์ž…๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ๋„๋„์™€ ์ˆ˜์—ฐ์ด๊ฐ€ ๊ฐ€์ง€๋Š” ์นด๋“œ์˜ ๊ฐœ์ˆ˜ N(1≤N≤30000)๊ณผ ๊ฒŒ์ž„ ์ง„ํ–‰ ํšŸ์ˆ˜ M(1≤M≤2500000)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๋„์–ด์“ฐ๊ธฐ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋„๋„์™€ ์ˆ˜์—ฐ์ด๊ฐ€ ๊ฐ€์ง„ ๋ฑ์˜ ๋งจ ์•„๋ž˜์— ์œ„์น˜ํ•œ ์นด๋“œ์— ์ ํ˜€ ์žˆ๋Š” ์ˆ˜๋ถ€ํ„ฐ ๋งจ ์œ„์— ์œ„์น˜ํ•œ ์นด๋“œ์— ์ ํžŒ ์ˆ˜๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. (๊ฐ๊ฐ์˜ ์นด๋“œ๋Š” 1 ์ด์ƒ 5 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜๊ฐ€ ์ ํ˜€์žˆ๋‹ค.)

์ถœ๋ ฅ

๊ฒŒ์ž„์„ ์ด๊ธด ์‚ฌ๋žŒ์ด ๋„๋„๋ผ๋ฉด do๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ๊ฒŒ์ž„์„ ์ด๊ธด ์‚ฌ๋žŒ์ด ์ˆ˜์—ฐ์ด๋ผ๋ฉด su๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋น„๊ฒผ์„ ๊ฒฝ์šฐ, dosu๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <deque>

using namespace std;

typedef deque<int> d;

d doCard, suCard;
d doGround, suGround;

// ์ข…์นœ์‚ฌ๋žŒ์˜ ์นด๋“œ๋ฑ์— ์ƒ๋Œ€์˜ ๊ทธ๋ผ์šด๋“œ ๋ฑ๊ณผ ์ž์‹ ์˜ ๊ทธ๋ผ์šด๋“œ ๋ฑ์„ ํ•ฉ์น˜๋Š” ํ•ฉ์ˆ˜
void mergeCard(d &winnerCard, d &loserGround, d &winnerGround) {
    for(int i=0; !loserGround.empty(); i++) {
        winnerCard.push_front(loserGround.front());
        loserGround.pop_front();
    }
    for(int i=0; !winnerGround.empty(); i++) {
        winnerCard.push_front(winnerGround.front());
        winnerGround.pop_front();
    }
}

// ๊ทธ๋ผ์šด๋“œ์— ์นด๋“œ๋ฅผ ๋‚ด๋†“์„๋•Œ๋งˆ๋‹ค ์ข… ์น  ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜์—ฌ ์ข…์„ ์นœ๋‹ค.
void hitBell() {
    // groundTop=0 : ๊ทธ๋ผ์šด๋“œ๊ฐ€ ๋น„์–ด์žˆ์Œ
    int doGroundTop=0, suGroundTop=0;
    if(!doGround.empty())
        doGroundTop = doGround.back();
    if(!suGround.empty())
        suGroundTop = suGround.back();
    
    // ์ˆ˜์—ฐ์ด๊ฐ€ ์ข…์นจ (๊ทธ๋ผ์šด๋“œ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š์•„์•ผํ•˜๊ณ , ํ•ฉ์ด 5์—ฌ์•ผํ•จ)
    if(doGroundTop!=0 && suGroundTop!=0 && doGroundTop+suGroundTop==5)
        mergeCard(suCard, doGround, suGround);
    
    // ๋„๋„๊ฐ€ ์ข…์นจ (๋‘˜์ค‘ ํ•˜๋‚˜๊ฐ€ 5์—ฌ์•ผํ•จ)
    if(doGroundTop==5 || suGroundTop==5)
        mergeCard(doCard, suGround, doGround);
    
    // ์ข… ์•ˆ์นจ
    return;
}

string solution(int n, int m) {
    // ํ• ๋ฆฌ๊ฐˆ๋ฆฌ ์ˆ˜ํ–‰
    bool doTurn = true;
    while(m--){
        if(doTurn) {
            // ์ธ๋ฑ์Šค๊ฐ€ ์ž‘์„์ˆ˜๋ก ์•„๋ž˜์ชฝ์— ์œ„์น˜ํ•œ ์นด๋“œ => back์ด ์นด๋“œ์˜ ๊ผญ๋Œ€๊ธฐ์ชฝ ๋ฐฉํ–ฅ์ด๋‹ค
            doGround.push_back(doCard.back());
            doCard.pop_back();
            if(suCard.empty() || doCard.empty()) break; // ๋‘˜ ์ค‘ ํ•œ๋ช…์ด๋ผ๋„ ๊ฐฏ์ˆ˜๊ฐ€ 0์ด๋˜๋ฉด ๊ฒŒ์ž„ ์ข…๋ฃŒ
            hitBell();
        } else {
            suGround.push_back(suCard.back());
            suCard.pop_back();
            if(suCard.empty() || doCard.empty()) break;
            hitBell();
        }
        
        doTurn = !doTurn;
    }

    // ์Šน์ž ๊ฒฐ์ •
    if(suCard.size() > doCard.size())
        return "su";
    else if (suCard.size() < doCard.size())
        return "do";
    else
        return "dosu";
}

int main() {
    int n,m;
    cin >> n >> m;
    doCard.assign (n,0);
    suCard.assign (n,0);
    for(int i=0; i<n; i++)
        cin >> doCard[i] >> suCard[i];

    cout << solution(n, m);
    
    return 0;
}

/*
 */
๋ฐ˜์‘ํ˜•