본문 바로가기

컴퓨터/백준 알고리즘

백준 알고리즘 2164번: 카드2 [C++]

문제 출처: https://www.acmicpc.net/problem/2164

 

2164번: 카드2

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가

www.acmicpc.net

1. 코드

#include <iostream>

using namespace std;

class card {
	int f;
	int b;
	int *arr;
public:
	card(int n) {
		f = 0;
		b = -1;
		arr = new int[n];
	}
	void push(int n) {
		arr[++b] = n;
	}
	int pop() {
		if (empty()) return -1;
		return arr[f++];
	}
	int size() {
		return b - f + 1;
	}
	int empty() {
		return (b - f) == -1;
	}
	~card() {
		delete[] arr;
	}
};
int main(void)
{
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int n;
	cin >> n;

	card q(n * 2);

	for (int i = 1; i <= n; i++) q.push(i);

	while (q.size() != 1)
	{
		q.pop();
		q.push(q.pop());
	}
	cout << q.pop();
}

(실행)

2. 풀이

문제는 간단하다. 1부터 N까지 카드를 큐에 저장한 후 처음에는 그냥 pop을 해주고 그 이후에 다시 pop을 해주는데 여기서 이 값을 다시 push 해주고 큐에 저장된 값이 1개라면 그 값을 출력해주는 문제이다. 그래서 큐에 대한 기능을 구현한 다음 while() 문을 통해서 손쉽게 해결이 가능하다.