✅ deque
주어진 예제를 통해 이해를 해보면
[3 2 1 -3 -1] 의 순서대로 풍선이 있고
첫번째 풍선부터 터지므로 터질 풍선은 3이고 위치는 "1"이다.
-> [2 1 -3 -1]
터진 곳에서부터 오른쪽으로 3만큼 이동하면
다음에 터질 풍선은 -3이고 위치는 "4"이다.
-> [2 1 -1]
터진 곳에서부터 왼쪽으로 3만큼 이동하면
다음에 터질 풍선은 -1이고 위치는 "5"이다.
-> [2 1]
터진 곳에서부터 왼쪽으로 1만큼 이동하면
다음에 터질 풍선은 1이고 위치는 "3"이다.
-> [2]
터진 곳에서부터 오른쪽으로 2만큼 이동하면
다음에 터질 풍선은 2이고 위치는 "2"이다.
-> 남은 풍선이 없으므로 종료
즉, 터진 풍선의 번호는 1 - 4 - 5 - 3 - 2
여기서 말하는 터질 풍선의 위치는 처음 순서 기준이다.
즉, 원 형태로 데이터를 저장하여 탐색하는 문제로 queue를 통해 구현할 수 있다. 하지만 이문제는 왼쪽, 오른쪽 모두 이동 가능하기 때문에 deque를 사용한다.
이전 문제와 동일하게 해당 순서가 아닌 풍선은 순번이 넘어가고
해당 순서 풍선은 제거되며 그때 처음 순서 기준으로 위치를 반환한다.
주의해야 할 점은, 처음 순서 기준으로 위치를 반환해야 하기 때문에 처음 위치도 같이 저장해야 한다.
본인은 pair<풍선에 적힌 번호, 처음 순서 기준 위치>을 사용함
cin >> N
for(i : 1 ~ N){
cin >> num
que.push(make_pair(num, i))
}
// 첫번째 풍선부터 시작
vector.push(dq.front.second)
jump = dq.front.first
dq.pop_back
if(jump > 0) jump--
else jump++
while(!que.empty){
if(jump > 0){ // 오른쪽으로 이동
while(jump != 0){
dq.push_front(dq.back)
dq.pop_back
jump --;
}
vector.push(dq.back.second)
jump = dq.back.first
dq.pop_back
}
if(jump < 0){ // 왼쪽으로 이동
while(jump != 0){
dq.push_back(dq.front)
dq.pop_front
jump ++;
}
vector.push(dq.front.second)
jump = dq.front.first
dq.pop_front
}
}
print(vector)
O(N^2)
문제 자체는 이전문제와 동일한 풀이 방법이지만 처음 순서를 저장해둬야 하기 때문에
구현이 약간 더 복잡함