for(int i=0; i<n; i++) { cin >> a; if (a == "push") { cin >> k; q.push(k); // 큐 q에 정수 k를 밀어넣음 } elseif (a == "pop") { // 만약 큐 q가 비어있다면, -1을 출력함 if (q.empty()) cout << -1 << "\n"; // 만약 큐 q가 비어있지 않다면, else { cout << q.front() << "\n"; // 큐 q의 맨 앞에 있는 요소를 불러와 출력함 q.pop(); // 큐 q의 맨 앞에 있는 요소를 꺼냄 } } elseif (a == "front") { // 만약 큐 q가 비어있다면, -1을 출력함 if (q.empty()) cout << -1 << "\n"; // 만약 큐 q가 비어있지 않다면, 큐 q의 맨 앞에 있는 요소를 불러와 출력함 else cout << q.front() << "\n"; } elseif (a == "back") { // 만약 큐 q가 비어있다면, -1을 출력함 if (q.empty()) cout << -1 << "\n"; // 만약 큐 q가 비어있지 않다면, 큐 q의 맨 뒤에 있는 요소를 불러와 출력함 else cout << q.back() << "\n"; } elseif (a == "size") cout << q.size() << "\n"; // 큐 q의 크기를 출력함 elseif (a == "empty") { if (q.empty()) cout << 1 << "\n"; else cout << 0 << "\n"; } } return0; }
10866. 덱
덱이란 double-ended queue의 줄임말로, 양방향에서 요소를 삽입하고 삭제할 수 있는 자료구조이다. 덱 라이브러리 <deque>에 들어있는 기본 함수들의 사용법은 다음과 같다.
deque<자료형> dq → ‘dq’라는 이름의 해당 자료형의 덱을 선언함
dq.push_front(a) → 덱 dq의 맨 앞에에 a를 밀어넣음 (단, a는 덱 dq와 같은 자료형이어야 함)
dq.push_back(a) → 덱 dq의 맨 뒤에 a를 밀어넣음 (단, a는 덱 dq와 같은 자료형이어야 함)
dq.pop_front() → 덱 dq의 맨 앞에 있는 요소를 꺼냄
dq.pop_back() → 덱 dq의 맨 뒤에 있는 요소를 꺼냄
dq.front() → 덱 dq의 맨 앞에 있는(가장 먼저 들어간) 요소를 불러옴
dq.back() → 덱 dq의 맨 뒤에 있는(가장 나중에 들어간) 요소를 불러옴
dq.size() → 덱 dq의 크기를 불러옴 (비어있을 경우 0)
dq.empty() → 덱 dq가 비어있는지 여부를 확인함 (비어있을 경우 true, 즉 1)
그런데, BOJ 10866번 문제에서는 size() 함수를 사용하면 시간 초과가 뜬다. 이는 size() 연산의 처리 방식과 관련이 있는데, size() 연산은 실행할 때마다 해당 자료구조의 처음부터 끝까지 전부 훑고 지나가기 때문이다. 따라서 다음과 같은 형태의 풀이가 요구된다.