득이공간

[백준 C++] 18115 카드 놓기 - 덱 본문

PS/알고리즘 문제풀이

[백준 C++] 18115 카드 놓기 - 덱

쟁득 2024. 2. 20. 22:33
 

18115번: 카드 놓기

수현이는 카드 기술을 연습하고 있다. 수현이의 손에 들린 카드를 하나씩 내려놓아 바닥에 쌓으려고 한다. 수현이가 쓸 수 있는 기술은 다음 3가지다. 제일 위의 카드 1장을 바닥에 내려놓는다.

www.acmicpc.net

#include <iostream>
#include <deque>
using namespace std;

deque<int> Skills;
deque<int> InitialCards;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	int N;
	cin >> N;
	for (int i = 1; i <= N; ++i)
	{
		int Skill;
		cin >> Skill;
		Skills.push_back(Skill);
	}

	for (int Card = 1; Card <= N; ++Card)
	{
		int Skill = Skills.back();
		Skills.pop_back();

		int Temp;
		switch (Skill)
		{
		case 1:
			InitialCards.push_front(Card);
			break;

		case 2:
			InitialCards.push_front(Card);
			Temp = InitialCards[0];
			InitialCards[0] = InitialCards[1];
			InitialCards[1] = Temp;
			break;

		case 3:
			InitialCards.push_back(Card);
			break;
		}
	}

	while (!InitialCards.empty())
	{
		cout << InitialCards.front() << ' ';
		InitialCards.pop_front();
	}
}

 

덱을 이용해서 푸는 문제입니다.

풀이 방법은 현재 놓여진 카드 상태가 위에서부터 1~N이 순서대로 배치되어 있으므로,

사용했던 기술을 뒤에서부터 현재 카드 상태에 거꾸로 적용해주어 초기 카드 상태로 복원해주면 됩니다.

 

1번 기술: 현재 놓여진 맨 위의 카드를 초기 카드 덱에 맨 위에 놓는다.

2번 기술: 현재 놓여진 맨 위의 카드를 초기 카드 덱 맨위에 놓고 두 번째 카드와 스왑한다.

3번 기술: 현재 놓여진 맨 위의 카드를 초기 카드 덱 맨 뒤에 놓는다.