덱에 넣고 이쪽 저쪽으로 돌려가면서 확인하는 문젠데
중간 중간 헷갈리는 부분들이 있어서 푸는 데 시간이 좀 걸렸다.
예를 들어 정수 a와 정수 b사이의 (a, b 포함) 정수의 개수를 세려면
b-a
가 아니라 b-a+1
을 해줘야 하는 것과 비슷한 류의 헷갈림이었다.
또, 풍선의 위치가 계속 바뀌는데 터지는 풍선의 인덱스 값이 필요하므로
deque<pair<int, int>>
타입으로 선언해줬다.
먼저 첫 번째 풍선 터뜨리고 그 값을 저장해뒀다가
음수인지 양수인지에 따라 애들을 뒤로 돌릴 지 앞으로 돌릴 지 결정한다.
move
가 갱신되기 전까진 양수인지 항상 알고 있어야 하는데
얼마나 돌렸는지도 알아야하니 cnt
라는 변수를 맹글어주고
양수면 move - 1
, 음수면 move + 1
해줬다.
왜냐면 풍선 하나가 이미 터졌고 이것은 한 번 확인한 것과 같기 때문.
다른 건 다 바꿔놓고
while 문 직전에 있는 cnt
계산식을 cnt = move
로 둬서 자꾸 틀렸다.
어떤 변수의 계산 방식이 바뀌었다면
다른 줄에서 사용되는 그 변수의 계산식도 수정할 것 (당연)
#include <iostream>
#include <deque>
using namespace std;
int main() {
int n, num;
deque<pair<int, int>> dq;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> num;
dq.push_back({ i, num });
}
int move = dq.front().second;
dq.pop_front();
cout << "1 ";
int cnt = move > 0 ? move - 1 : move + 1;
while (!dq.empty()) {
if (move > 0) {
if (cnt == 0) {
cout << dq.front().first;
if (dq.size() != 1) cout << " ";
move = dq.front().second;
cnt = move > 0 ? move - 1 : move + 1;
dq.pop_front();
}
else {
dq.push_back(dq.front());
dq.pop_front();
cnt--;
}
}
else {
if (cnt == 0) {
cout << dq.back().first;
if (dq.size() != 1) cout << " ";
move = dq.back().second;
cnt = move > 0 ? move - 1 : move + 1;
dq.pop_back();
}
else {
dq.push_front(dq.back());
dq.pop_back();
cnt++;
}
}
}
return 0;
}