백준/실랜디, 골랜디

[백준] C++ AC(5430)

2zreal 2024. 12. 27. 21:23

 

간단하게 R와 D의 두 종류의 함수를 입력받아서 결과를 출력하는 문제이다.

R은 뒤집는 역할을 하고 D는 가장 앞에 있는 수를 버리는 역할을 한다.

앞 뒤를 뒤바꾸는 문제이기 때문에 deque을 떠올릴 수 있어야 한다.

 

문제풀이방법

1. 우선 입력으로 주어지는 숫자를 파싱 해서 deque에 저장한다.(99,40,51 이렇게 두 자리가 들어올 수도 있기 때문에 구분을 잘해야 함. 나는 ', '와 ']'이게 들어오기 전에는 string temp에 계속 저장하고 저 문자가 들어오면 큐에 push 하는 방식으로 진행하였다.)

2. 방향을 나타내는 변수와 error를 판단하는 변수 또한 필요하다.

3. 방향이 역방향이면 back에서 pop 정방향이면 front에서 pop을 진행한다.(pop을 진행했는데 deque에 요소가 존재하지 않는다면 error 변수를 활용)

4. 위 과정을 거친 후 deque에서 남아있는 요소들을 모두 출력한다.

 

#include <iostream>
#include <deque>
#include <string>

using namespace std;

int main(void)
{
	int n = 0;

	cin >> n;

	for (int i = 0; i < n; i++)
	{
		int dir = 0;
		deque<int> dq;
		int num = 0;
		string s = "";
		string r = "";

		int sig = 0;

		cin >> s >> num >> r;
		string stemp = "";
		for (int j = 0; j < r.size(); j++)
		{
			if (r[j] == ',' || r[j] == ']')
			{
				if (stemp != "")
				{
					dq.push_back(stoi(stemp));
					stemp = "";
				}
			}
			if (r[j] != ',' && r[j] != '[' && r[j] != ']')
			{
				stemp += r[j];
				//dq.push_back(r[j]-48);
			}
		}
		for (int j = 0; j < s.size(); j++)
		{
			if (s[j] == 'D')
			{
				if (!dq.empty())
				{
					if (dir == 0)
					{
						dq.pop_front();
					}
					else
					{
						dq.pop_back();
					}
				}
				else
				{
					sig = 1;
					break;
				}
				
			}
			else if (s[j] == 'R')
			{
				if (dir == 0)
				{
					dir = 1;
				}
				else
				{
					dir = 0;
				}
			}
		}

		if (sig == 0)
		{
			cout << '[';
			while (!dq.empty())
			{
				if (dir == 0)
				{
					cout << dq.front();
					dq.pop_front();
					if (!dq.empty())
					{
						cout << ',';
					}
				}
				else
				{
					cout<<dq.back();
					dq.pop_back();
					if (!dq.empty())
					{
						cout << ',';
					}
				}

			}
			cout << ']' << endl;
		}
		else
		{
			cout << "error" << endl;
		}
		
	}

	return 0;
}

 

파싱과 deque의 개념만 알면 간단하게 풀 수 있는 문제이다.