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; }