1 분 소요

Intro

image

image

문제해결 및 소스코드

문제이름처럼 에이씨 소리나오게 귀찮은 조건따지기 문제이다.

각 테스트 케이스별로 주어진 배열을, 주어진 함수에 따라 처리하는 문제다.

함수와 배열의 길이가 상당히 길기때문에 deque를 사용했다.

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

using namespace std;

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

	int T;						// 테스트케이스 수
	int n;						// 배열안 수의 갯수

	string strp, strn;			// 문자열 함수, 배열
	string temp = "";			// 공백

	cin >> T;

	// T만큼 반복
	for (int i = 0;i < T;i++)
	{
		bool isBreak = false;
		bool isReverse = false;
		deque<int> dq;

		cin >> strp;
		cin >> n;
		cin >> strn;

		for (int j = 1;j < strn.length();j++)
		{
			// ',' 이면 쉼표전까지의 숫자를 deque에 삽입
			if (strn[j] == ',' || strn[j] == ']')
			{
				// 예외처리( 빈 배열이 입력될 경우가 있으므로 )
				if (temp != "")
				{
					dq.push_back(stoi(temp));
					temp = "";
				}
			}
			// 숫자면 temp에 저장(이어붙이기)
			else
			{
				temp += strn[j];
			}
			
		}

		// 함수 p 처리
		for (int j = 0;j < strp.length();j++)
		{
			// 뒤집기
			if (strp[j] == 'R')
			{
				isReverse = !isReverse;
			}
			// 버리기
			else if (strp[j] == 'D')
			{
				// 배열이 비었을 때
				if (dq.empty())
				{
					cout << "error\n";
					isBreak = true;
					break;
				}
				else
				{
					// 역방향
					if (isReverse)
						dq.pop_back();
					// 정방향
					else
						dq.pop_front();
				}
			}
		}

		// Error면 출력단 실행X
		if (isBreak)
			continue;

		// 반전되어야할 때
		if (isReverse)
			reverse(dq.begin(), dq.end());
		
		// 출력단
		cout << "[";
		for (int j = 0;j < dq.size();j++)
		{
			if (j != dq.size() - 1)
				cout << dq[j] << ",";
			else
				cout << dq[j] << "]\n";
		}

	}
}


코드가 꽤 길지만 별거없다.

배열을 입력받고, 숫자만 deque에 저장하는 작업이 필요하다.

또 뽑아낸 숫자배열로 함수(R, D)처리가 필요하다. 이때 뒤집기함수(R) 같은경우에는

플래그(isReverse)를 두어서 그때그때 처리하는것이아닌 버릴거 다 버리고 최종적으로 한번 실행한다.

안그러면 쓸데없이 시간을 많이 쓰게되어 시간초과가 발생한다.

따라서 반전 여부에따라 버리기함수(D)를 배열의 앞쪽에서할지 뒷쪽에서할지 처리해주어야한다.

댓글남기기