https://www.acmicpc.net/problem/2346
2346번: 풍선 터뜨리기
1번부터 N번까지 N개의 풍선이 원형으로 놓여 있고. i번 풍선의 오른쪽에는 i+1번 풍선이 있고, 왼쪽에는 i-1번 풍선이 있다. 단, 1번 풍선의 왼쪽에 N번 풍선이 있고, N번 풍선의 오른쪽에 1번 풍선
www.acmicpc.net
#include <iostream>
#include <queue>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
deque<pair<int, int>> q; //{풍선 안 종이에 적힌 번호, 풍선의 번호}
cin >> n;
for (int i = 1; i <= n; i++) {
int temp;
cin >> temp;
q.push_back(make_pair(temp, i));
}
while (!q.empty()) {
pair<int, int> cur = q.front();
cout << cur.second<<" ";
q.pop_front();
if(q.empty()) break;
//양수일 경우 오른쪽으로 이동
if (cur.first > 0) {
for (int i = 0; i < cur.first - 1; i++) {
q.push_back(q.front());
q.pop_front();
}
}
//음수일 경우 왼쪽으로 이동
else {
for (int i = 0; i > cur.first; i--) {
q.push_front(q.back());
q.pop_back();
}
}
}
return 0;
}
요제푸스 문제에 양방향으로 이동하므로 deque를 사용하여 풀 수 있다.
deque에 {풍선 안의 종이에 적힌 번호, 풍선의 번호}를 pair로 받아 넣고
터뜨려야 할 풍선의 번호를 출력하고 pop한다.
그 후 모든 풍선이 터질 때 까지 해당 종이의 숫자만큼
풍선의 종이 번호가 양수이면 front에서 꺼내 back에, 음수이면 back에서 꺼내 front에 집어넣는다.
다만 양수일 경우에는 처음 풍선이 터질 때 pop하므로 cur.first-1 만큼만 반복문을 돌린다.
'Coding Test' 카테고리의 다른 글
백준 4195 친구 네트워크 (3) | 2024.04.06 |
---|---|
백준 21939 문제 추천 시스템 Version 1 (0) | 2024.04.05 |
백준 16937 두 스티커 (2) | 2024.04.03 |
백준 2512 예산 (0) | 2024.04.02 |
백준 15657 N과 M(8) (2) | 2024.04.01 |