백준 5430 AC알고리즘/백준2023. 3. 16. 23:12
Table of Contents
https://www.acmicpc.net/problem/5430
후기
문제 내용 자체는 이해하기 쉬웠던거 같습니다. R이면 뒤집고, D라면 삭제하고. 다만 이를 구현하는게 늘 어려운거 같습니다...
다만 시간복잡도가 있기 때문에 R이 나올 때마다 reverse는 안된다고 생각이 들었고 D가 나오기 전까지 R의 개수를 카운트 한다음에 D가 나왔으면 R의 카운트 개수를 본다음 짝수라면 아무것도 하지않고 홀수면 한번 reverse함수를 통해서
로직을 짠다음 출력할려고 했습니다.
다만 입력을 받는 부분부터 살짝 버벅이고 출력하는 부분에서도 애를 먹다 2시간 반정도 문제풀이를 진행하다 못풀었네요...ㅠ
해당 문제는 R에 따라서 pop_back(), pop_front()만 진행해주면 되는 문제입니다.
가령 함수에 RRRDDRRDDRRRDDR 인 경우 flag를 두어 R에 따라 flag를 true -> false -> true 진행하면서 진행할 때마다 D에 따라 pop_back(), pop_front() 진행하는게 로직입니다.
따라서 실제로 데이터를 뒤집지않고 상태만을 확인해서 로직을 실행하는 것입니다.
Code
#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;
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 25206 너의 평점은 (0) | 2023.04.11 |
---|---|
백준 10811 바구니 뒤집기 (0) | 2023.03.24 |
백준 3015 오아시스 (0) | 2023.03.22 |
백준 15926 현욱은 괄호왕이야! (0) | 2023.03.21 |
백준 15353 큰수 A+B (2) (0) | 2023.03.18 |
@CGNY :: 김놀자
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!