[백준/C++] 2346번: 풍선 터뜨리기

-inn·2022년 5월 24일
0

백준

목록 보기
21/28

2346번: 풍선터뜨리기 문제 바로가기

문제


문제 풀이 과정

1부터 N까지 풍선에 숫자가 주어지고, 해당 숫자만큼 idx를 이동시켜 다음 idx에 해당하는 풍선을 터뜨리는 방식

단, 원형의 형태로 1보다 왼쪽은 N이 되고, N보다 오른쪽은 1이 된다.

  1. 풍선의 번호(idx)과 적혀진 수(nxt)를 담은 vector v 선언
  2. 맨 앞의 풍선의 번호(idx) 출력 후, 값 삭제
  3. 적혀진 수(nxt)가 양수, 즉 오른쪽 방향일 경우
    • (nxt-1)만큼 v의 맨 앞 값을 맨 뒤로 이동
    • 맨 앞의 값 삭제 = 해당 풍선 터뜨림
  4. 적혀진 수(nxt)가 음수, 즉 왼쪽 방향일 경우
    • nxt만큼 v의 맨 뒤 값을 맨 앞으로 이동 이때, nxt는 크기를 나타냄 x(-1)
    • 맨 뒤의 값 삭제 = 해당 풍선 터뜨림
  5. v가 다 빌 때까지(풍선 다 터질 때까지) 2.부터 다시 반복

코드

#include <iostream>
#include <vector>
using namespace std;

struct info {
    int idx, nxt;
};

int n;
vector <info> v;

int main() {
    cin >> n;
    for (int i = 1, num; i <= n; i++) {
        cin >> num;
        v.push_back({i, num});
    }
    
    while(!v.empty()) {
        cout << v.front().idx << " ";
        int nxt = v.front().nxt;
        v.erase(v.begin());
        if (nxt > 0) {  // 오른쪽 이동
            for (int i = 0; i < nxt - 1; i++) {
                v.push_back(v.front());
                v.erase(v.begin());
            }
        } else {  // 왼쪽 이동
            for (int i = 0; i < (nxt * (-1)); i++) {
                v.insert(v.begin(), v.back());
                v.erase(v.end() - 1);
            }
        }
    }
    
    return 0;
}
profile
☁️

0개의 댓글