πŸ•οΈ ICPC Sinchon/Simulation

[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;
}

/*
 */
λ°˜μ‘ν˜•