BOJ 9358 - 순열 접기 게임
알고리즘/구현문제
https://www.acmicpc.net/problem/9358
풀이
주어진 수열의 첫번째 수와 N번째 수를 더해 새 수열에 넣고, 두번째 수와 N-1번째 수를 더해 다시 새 수열에 넣고.. 이 작업을 수열의 길이가 2가 될 때까지 반복한 후 왼쪽 수가 큰지 오른쪽 수가 큰지 비교하는 문제이다.
이 문제는 양방향 큐, 즉 Deque(Double Ended Queue, [덱])를 사용하면 쉽게 풀수 있다. 새 수열을 만드는 과정에서 왼쪽 수(front)와 오른쪽 수(back)를 쉽게 큐에서 꺼낼수(pop) 있어 전체적인 코드가 짧아지고 구현이 간편해진다.
#include <cstdio>
#include <deque>
using namespace std;
int main() {
int t,i,j,x,n;
scanf("%d",&t);
for(i=1;i<=t;i++){
scanf("%d",&n);
deque<int> dq;
for(j=0;j<n;j++){
scanf("%d",&x);
dq.push_back(x);
}
while(1){
if(dq.size() == 2) break;
deque<int> cur;
while(!dq.empty()){
cur.push_back(dq.front()+dq.back());
dq.pop_front();
if(!dq.empty()) dq.pop_back();
}
while(!cur.empty()){
dq.push_back(cur.front());
cur.pop_front();
}
}
printf("Case #%d: %s\n",i,dq[0]>dq[1]?"Alice":"Bob");
}
return 0;
}