컴퓨터공학/알고리듬 풀이

백준-스택, 큐, 덱 1 2346 풍선 터뜨리기

cyphen156 2025. 6. 18. 19:27

풍선 터트리기

풍선 : 원형 리스트

풍선 내부 종이 : data

1번 풍선을 터트리고 그 안의 data만큼 이동하여 다음 풍선을 터트린다. -> pop() 

제약사항

  • 0 < N <= 1,000
  • -N <= data<= N
  • data != 0

주의 사항

없다.

CPP풀이

풍선 터트리기_2346.cpp

/**
 * 백준 풍선 터트리기_2346
 * 풍선 : 이중연결 리스트
 * 풍선 내부 종이 : data
 * 1번 풍선을 터트리고 그 안의 data만큼 이동하여 다음 풍선을 터트린다.-> pop() 
 * 
 * 제한사항
 *****************************************
 * 0 < N <= 1,000                        *
 * -N <= data<= N                        *
 * data != 0                             *       
 *****************************************
 *
 *
 *
 * 주의
 * 없다.
 * 
 * 풀이시간 30분
 */


#include <iostream>

using namespace std;

struct Node 
{
    int _index;
    int _data;
    Node* prev;
    Node* next;
};

Node* head = nullptr;
Node* current = nullptr;

void Push(int index, int data);
int Pop();

int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int N;
    cin >> N;

    for (int i = 0; i < N; ++i)
    {
        int input;
        cin >> input;
        Push(i, input);
    }

    current = head;

    for (int i = 0; i < N; ++i)
    {
        cout << Pop() << " ";
    }

    return 0;
}

void Push(int index, int data)
{
    Node* newNode = new Node();
    newNode->_index = index;
    newNode->_data = data;

    if (!head) 
    {
        head = newNode;
        head->next = head;
        head->prev = head;
    } 
    else 
    {
        Node* tail = head->prev;
        tail->next = newNode;
        newNode->prev = tail;
        newNode->next = head;
        head->prev = newNode;
    }
}

int Pop()
{
    int move = current->_data;
    int result = current->_index + 1;

    if (current->next == current)
    {
        delete current;
        current = nullptr;
    }
    else
    {
        // 현재 선택된놈 빼버리기
        Node* temp = current;
        current->prev->next = current->next;
        current->next->prev = current->prev;

        if (move < 0)
        {
            move = -move;
            for (int i = 0; i < move; ++i)
            {
                current = current->prev;
            }
        }
        else
        {
            for (int i = 0; i < move; ++i)
            {
                current = current->next;
            }
        }
        delete temp;
    }

    return result;
}

모든 예제 코드의 소스파일은 제 개인 깃허브 레포지토리에 있습니다.

 

Workspace/알고리듬 풀이 at main · cyphen156/Workspace

Studying . Contribute to cyphen156/Workspace development by creating an account on GitHub.

github.com