백준 5430 AC ❌👀👀👀

CJB_ny·2023년 3월 16일
0

백준

목록 보기
104/104

AC


후기

2시간 30분 정도 품. => 못 풀었다.

입력을 받는부분부터 조금 버벅거림.
cin >> a; cin.clear(); 이런식르로 하나하나 clear() 해가며 받아주는 식으로 햇었음.

cin >> s >> t >> k;
// 이렇게해도 문제처럼
// 2
// 3
// 4
// 이런식으로 입력받을 수 있다.

내가 생각한로직은 어쨋든 입력을 다 받은다음에

매번 뒤집으면 시간초과가 날거같아서,
함수가 RRRDDRRDDRR 이런식이라면은 D가 나오기 전까지 R의 갯수를 카운트를 한다음에

D가 나왔을 때 R의 갯수가 짝수라면 뒤집지않고 홀수라면 한번 뒤집는 로직을 일단은 생각함.

그리고 출력할때 출력하는 부분도 시간꽤걸리고 구현을 못함.

예외사항도 처리를 못햇음.

분석

실제로 출력할 때만 뒤집고 로직상으로는 뒤집지않고 숫자들만 vector나 deque에다가 넣어준다.

그리고 함수의 내용에 따라 R이라면 flag를 하나 놔두어서 rev = !rev이런식으로 뒤집혔다라는 상태만 확인해준다음에

뒤집힌것이라면 pop_front()
뒤집히지않은 것이라면 pop_back() 으로 진행을 한다.

이후 실제로 뒤집힌 것이라면 뒤집어서 콤마와함께 출력하고 뒤집히지않은 것이라면 dq를 콤마와 함께 그대로 출력해준다.

cpp

#include <bits/stdc++.h>
using namespace std;

#define endl "\n"

int T, N, x;
string P, order;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	cin >> T;
	for (int t = 0; t < T; ++t)
	{
		deque<int> DQ;
		cin >> P >> N >> order;
		x = 0;
		for (char c : order)
		{
			if (c == '[' || c == ']') continue;
			
			// 숫자가 나오면 (현재 수 * 10) 한 뒤 더함.
			if (c >= '0' && c <= '9') x = x * 10 + c - '0'; // c - '0' (숨은 디테일?) 
			// 아닐 경우 수를 덱에 넣음
			else 
			{
				if (x > 0) DQ.push_back(x);
				x = 0;
			} 
		}
		
		// 이 부분 왜 넣은것인가요? 
		if (x > 0) DQ.push_back(x);
		
		// 초기에는 에러없음. 뒤집히지 않은 상태
		bool error = false, rev = false;
		for (char a : P)
		{
			if (a == 'R') rev = !rev;
			else 
			{
				// 비어있는데 제거하려 하면 에러
				if (DQ.empty()) 
				{
					error = true;
					break;
				}
				if (rev) DQ.pop_back();
				else DQ.pop_front();
			}
		}
		// 에러가 발생한 경우 
		if (error) cout << "error" << endl;
		else 
		{
			cout << "[";		
			// DQ가 뒤집힌 상태라면 진짜로 뒤집어준다.
			if (rev) reverse(DQ.begin(), DQ.end());
			for (int i = 0; i < DQ.size(); ++i)
			{
				cout << DQ[i];
				if (i < DQ.size() - 1) cout << ",";
			}
			cout << "]" << endl;
		}
	}
	
	return 0;
}
profile
공부 일기장으로 변해버린 블로그 (https://cjbworld.tistory.com/ <- 이사중)

0개의 댓글