백준 5430 C++ - AC
Intro
문제해결 및 소스코드
문제이름처럼 에이씨 소리나오게 귀찮은 조건따지기 문제이다.
각 테스트 케이스별로 주어진 배열을, 주어진 함수에 따라 처리하는 문제다.
함수와 배열의 길이가 상당히 길기때문에 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)를 배열의 앞쪽에서할지 뒷쪽에서할지 처리해주어야한다.
댓글남기기