www.acmicpc.net/problem/2346

 

2346번: 풍선 터뜨리기

첫째 줄에 자연수 N(1≤N≤1,000)이 주어진다. 다음 줄에는 차례로 각 풍선 안의 종이에 적혀 있는 수가 주어진다. 편의상 0은 적혀있지 않다고 가정하자.

www.acmicpc.net


  • 하나를 터뜨린 후에 해당 숫자만큼 옆으로 이동해야 하는데, 풍선을 터뜨렸기 때문에 인덱스가 조정이 된다.
  • 일반적인 배열보다 큐를 사용하여 해당 갯수만큼 풍선들을 pop 과 push 처리 해주면 된다.
  • 양쪽으로 빠져야 하기 때문에 덱을 사용해준다.

#include <iostream>
#include <deque>

using namespace std;

int n, temp;
deque<pair<int, int>> dq;

int main(void)
{
    cin >> n;
    for(int i = 0 ; i < n ; i++)
    {
        cin >> temp;
        dq.push_back({temp, i});        // 덱에 숫자와 인덱스를 같이 넣어준다
    }
    while(dq.size())                    // 풍선을 다 터트릴때까지
    {
        pair<int, int> cur = dq.front();    // 현재 풍선에 대한 정보를 가진 후
        dq.pop_front();                     // 풍선 터뜨림
        cout << cur.second + 1 << " ";      // 이번에 터뜨린 풍선에 해당하는 인덱스를 출력해줌
        if(cur.first > 0)                   // 양수일 경우
        {
            for(int i = 0 ; i < cur.first-1 ; i++)  // 하나를 터트렸으니 -1 해준 갯수만큼

            {
                dq.push_back(dq.front());           // 오른쪽 풍선들을 뒤로 옮겨줌
                dq.pop_front();
            }
        }
        else                                // 음수일 경우
        {
            for(int i = 0 ; i < -cur.first ; i++)   // 왼쪽풍선들은 해당 갯수 그대로
            {
                dq.push_front(dq.back());           // 앞으로 이동
                dq.pop_back();
            }
        }
    }
    cout << endl;
}

 

'PS > BOJ' 카테고리의 다른 글

[백준] 9184 : 신나는 함수 실행  (0) 2021.01.18
[백준] 7562 : 나이트의 이동  (0) 2021.01.17
[백준] 1699 : 제곱수의 합  (0) 2021.01.15
[백준] 11052 : 카드 구매하기  (0) 2020.12.30
[백준] 1261 : 알고스팟  (0) 2020.12.29

+ Recent posts