알고리즘/BOJ

[BOJ] 2345. 풍선 터뜨리기

hyerann 2020. 4. 27. 01:38

백준 온라인 저지에 있는 2346번 풍선 터뜨리기 문제 풀이입니다. 🎈🎈🎈

문제

N개의 풍선이 있다. 각 풍선 안에는 -N부터 N까지의 수가 적혀있는 종이가 들어 있다. 이 풍선들을 다음과 같은 규칙으로 터뜨린다.

우선, 제일 처음에는 1번 풍선을 터뜨린다. 다음에는 풍선 안에 있는 종이를 꺼내어 그 종이에 적혀있는 값만큼 이동하여 다음 풍선을 터뜨린다. 양수가 적혀 있을 경우에는 오른쪽으로, 음수가 적혀 있을 때는 왼쪽으로 이동한다. 풍선은 원형으로 놓여 있다고 생각한다. 즉, 1번 풍선의 왼쪽에 N번 풍선이 있고, N번 풍선의 오른쪽에 1번 풍선이 있는 것이다. 이동할 때에는 이미 터진 풍선은 빼고 생각한다.

예를 들어 다섯 개의 풍선 안에 차례로 3, 2, 1, -3, -1이 적혀 있었다고 하자. 이 경우 3이 적혀 있는 1번 풍선, -3이 적혀 있는 4번 풍선, -1이 적혀 있는 5번 풍선, 1이 적혀 있는 3번 풍선, 2가 적혀 있는 2번 풍선의 순서대로 터지게 된다.

문제 해결 포인트

1️⃣ 풍선이라는 객체는 풍선의 번호, 풍선 안에 있는 종이에 적혀있는 수에 대한 정보를 가지고 있다.

      🔑 풍선의 번호, 풍선 안에 있는 종이에 적혀있는 수를 파라미터로 가지는 Ballon 클래스를 만든다.
2️⃣ 풍선 안에 있는 종이에 적혀있는 수가 양수일 경우 오른쪽으로, 음수일 경우 왼쪽으로 이동한다.

      🔑 양방향 Queue인 Deque을 사용해

             양수일 경우 front를 pop하여 push_back하고, 음수일 경우 back을 pop하여 push_front한다.

      🔑 단, 양수일 경우 front를 pop하는 순간 오른쪽으로 이동한 것과 마찬가지이다. (step--를 넣어준 이유)

 

#include <iostream>
#include <deque>

using namespace std;

class Ballon {
public:
    int indexNum;
    int insideNum;

    Ballon(int indexNum, int insideNum):indexNum(indexNum), insideNum(insideNum) {}
};

deque<Ballon> balloonDeq;

int main() {
    cin.tie(0); cout.tie(0);
    ios::sync_with_stdio(0);

    int n;
    cin >> n;

    for(int i=1; i<=n; i++) {
        int input;
        cin >> input;
        balloonDeq.push_back(Ballon(i, input));
    }

    while(!balloonDeq.empty()) {
        int step = balloonDeq.front().insideNum;
        cout << balloonDeq.front().indexNum << ' ';
        balloonDeq.pop_front();

        if(step > 0) {
            step--;
            while(step != 0) {
                balloonDeq.push_back(balloonDeq.front());
                balloonDeq.pop_front();
                step--;
            }
        }
        else if(step < 0) {
            while(step != 0) {
                balloonDeq.push_front(balloonDeq.back());
                balloonDeq.pop_back();
                step++;
            }
        }
    }

    return 0;
}