728x90
https://www.acmicpc.net/problem/2346
2346번: 풍선 터뜨리기
1번부터 N번까지 N개의 풍선이 원형으로 놓여 있고. i번 풍선의 오른쪽에는 i+1번 풍선이 있고, 왼쪽에는 i-1번 풍선이 있다. 단, 1번 풍선의 왼쪽에 N번 풍선이 있고, N번 풍선의 오른쪽에 1번 풍선
www.acmicpc.net
1~N번까지 원형으로 풍선이 놓여있다. 풍선 안에는 종이가 들어있다.
1번 풍선 터트리고 안에 있는 종이에 적혀있는 만큼 이동해서 다음 풍선 터트림.
양수면 오른쪽으로, 음수면 왼쪽으로 이동
풍선의 index를 꼭 저장해줘야 쉽게 풀 수 있다.
deque 자료구조에 pair를 사용해서 index와 풍선 종이 value를 넣어주고 pop, push 하면 쉽게 풀린다.
원형 deque이므로 맨 앞/맨 뒤 원소를 맨 뒤/맨 앞에 넣어주고 pop_front/pop_back을 해서 회전해준다.
그러면 다음 풍선이 맨 앞에 오게되므로 이를 출력해주고, 또 반복해준다.
💡 반복적으로 반복문이 시작되면 맨 앞 원소를 pop 하기 때문에 꼭 dq가 비었는지 확인해주자.
#include <iostream>
#include <deque>
using namespace std;
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n;
cin >> n;
deque<pair<int, int>> dq; //input index, value
for(int i=0; i<n; i++){
int a;
cin >> a;
dq.push_back({i, a});
}
while(!dq.empty()){
//pop-push하면서 맨 앞으로 터트릴 풍선 등장
cout << dq.front().first + 1 << ' '; //터트릴 풍선 인덱스 출력
int n = dq.front().second;
dq.pop_front(); //맨 앞 원소 없앰
if(dq.empty()) return 0; //위에서 맨 앞 원소를 없앴으므로 empty 였는지 확인하기
if(n > 0){ //양수면 오른쪽으로 이동
for(int i=0; i<n-1; i++){
dq.push_back(dq.front());
dq.pop_front();
}
}else{ //음수면 왼쪽으로 이동
for(int i=0; i<-n; i++){
dq.push_front(dq.back());
dq.pop_back();
}
}
}
return 0;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준/c++] 1068번: 트리 (0) | 2022.05.27 |
---|---|
[백준/c++] 9934번: 완전 이진 트리 (0) | 2022.05.19 |
[백준/c++] 1966번: 프린터 큐 (0) | 2022.05.16 |
[백준/c++] 2164번: 카드 2 (0) | 2022.05.16 |
[백준/c++] 1158번: 요세푸스 문제 (0) | 2022.05.16 |