c++

백준 c++ 5430 문제 풀이

psb08 2025. 5. 9. 07:42
728x90
반응형

문제 링크 : https://www.acmicpc.net/problem/5430

목차

1. 설명

 

2. 내 코드

 

3. 문제 풀이 해석 내용

 

4. 실행 결과

 

설명

백준 골드 5 문제 입니다.

문제명 : AC

 

내 코드

#include <iostream>
#include <string>
#include <queue>

using namespace std;

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

    int t;
    cin >> t;

    while (t--) 
    {
        string order, nums, num = "";
        int numSize;
        bool isError = false, isReverse = false;

        cin >> order >> numSize >> nums;

        deque<int> deq;

        for (int i = 0; i < nums.size(); i++) 
        {
            if (isdigit(nums[i])) 
            {
                num += nums[i];
            }
            else if (nums[i] == ',' || nums[i] == ']') 
            {
                if (!num.empty()) 
                {
                    deq.push_back(stoi(num));
                    num = "";
                }
            }
        }

        for (char cmd : order) 
        {
            if (cmd == 'R')
            {
                isReverse = !isReverse;
            }
            else if (cmd == 'D')
            {
                if (deq.empty())
                {
                    isError = true;
                    break;
                }
                if (isReverse)
                    deq.pop_back();
                else
                    deq.pop_front();
            }
        }

        if (isError)
        {
            cout << "error\n";
        }
        else 
        {
            cout << "[";
            if (isReverse)
            {
                for (int i = deq.size() - 1; i >= 0; --i)
                {
                    cout << deq[i];
                    if (i != 0)
                        cout << ",";
                }
            }
            else 
            {
                for (int i = 0; i < deq.size(); ++i) 
                {
                    cout << deq[i];
                    if (i != deq.size() - 1) cout << ",";
                }
            }
            cout << "]\n";
        }
    }

}

 

문제 풀이 해석 내용

 

입출력 최적화

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

 

 

테스트 케이스 개수 입력

int t;
cin >> t;

int t; cin >> t;: 사용자로부터 처리할 테스트 케이스의 개수 t를 정수로 입력받습니다.

 

 

테스트 케이스 처리 루프

while (t--)
{
    // ... (내부 코드) ...
}

while (t--): t번 반복하는 루프입니다. 

각 반복은 하나의 테스트 케이스를 처리합니다.

 

 

각 테스트 케이스 내부 - 입력 및 변수 선언

string order, nums, num = "";
int numSize;
bool isError = false, isReverse = false;

cin >> order >> numSize >> nums;

string order;: 적용할 함수 명령(예: "RDD") 문자열을 저장합니다.
int numSize;: 입력될 숫자 배열의 크기를 나타내는 정수입니다.
string nums;: 숫자 배열을 문자열 형태로 저장합니다 (예: "[1,2,3]").
bool isError = false;: 명령어 수행 중 에러(빈 배열에 D 명령)가 발생했는지 기록하는 플래그입니다.
bool isReverse = false;: 현재 배열이 뒤집혔는지(R 명령이 홀수 번 적용되었는지) 기록하는 플래그입니다.

 

 

숫자 배열 문자열 파싱하여 데크에 저장

deque<int> deq; // 데크 선언

for (int i = 0; i < nums.size(); i++)
{
    if (isdigit(nums[i])) // 숫자인 경우
    {
        num += nums[i]; // num 문자열에 추가
    }
    else if (nums[i] == ',' || nums[i] == ']') // 쉼표 또는 닫는 대괄호인 경우
    {
        if (!num.empty()) // num 문자열에 숫자가 모여있으면
        {
            deq.push_back(stoi(num)); // 숫자로 변환하여 데크의 뒤에 추가
            num = ""; // num 문자열 초기화
        }
    }
}

deque<int> deq;: 정수형 데이터를 저장할 데크 deq를 선언합니다.
for 루프는 입력받은 숫자 배열 문자열 nums를 순회합니다.
isdigit(nums[i]): 현재 문자가 숫자인지 확인합니다. 숫자이면 num 문자열에 이어 붙입니다.
nums[i] == ',' || nums[i] == ']': 현재 문자가 쉼표이거나 닫는 대괄호이면, 그 전에 모아둔 숫자 문자열 num이 비어있지 않은 경우 (즉, 숫자가 있는 경우)


stoi(num): 숫자 문자열 num을 정수로 변환합니다.
deq.push_back(...): 변환된 정수를 데크의 뒤에 추가합니다.
num = "";: 다음 숫자를 위해 num 문자열을 비웁니다.

 

 

명령어 수행

for (char cmd : order) // 명령어 문자열 순회
{
    if (cmd == 'R') // R 명령이면
    {
        isReverse = !isReverse; // 뒤집힘 상태 반전
    }
    else if (cmd == 'D') // D 명령이면
    {
        if (deq.empty()) // 데크가 비어있으면
        {
            isError = true; // 에러 플래그 설정
            break; // 명령어 수행 중단
        }
        if (isReverse) // 뒤집힌 상태이면
            deq.pop_back(); // 데크의 뒤에서 요소 제거
        else // 뒤집히지 않은 상태이면
            deq.pop_front(); // 데크의 앞에서 요소 제거
        }
    }

for (char cmd : order): 함수 명령 문자열 order의 각 문자를 순서대로 검사합니다.
cmd == 'R': 'R' 명령이면 isReverse 플래그를 반전시킵니다. (true는 false로, false는 true로)
cmd == 'D': 'D' 명령이면 데크에서 요소를 제거합니다.


if (deq.empty()): 제거하기 전에 데크가 비어있는지 확인합니다. 비어있으면 에러이므로 isError를 true로 설정하고 break로 명령 수행 루프를 중단합니다.


if (isReverse): isReverse가 true이면 데크가 뒤집힌 상태로 간주하고 deq.pop_back()으로 뒤쪽 요소를 제거합니다.
else: isReverse가 false이면 데크가 정상 상태로 간주하고 deq.pop_front()로 앞쪽 요소를 제거합니다.

 

 

결과 출력

if (isError)
{
    cout << "error\n"; // 에러가 발생했으면 "error" 출력
}
else
{
    cout << "["; // 결과 배열의 시작 대괄호 출력
    if (isReverse) // 뒤집힌 상태이면 뒤에서부터 출력
    {
        for (int i = deq.size() - 1; i >= 0; --i)
        {
            cout << deq[i];
            if (i != 0)
                cout << ",";
        }
    }
    else // 뒤집히지 않은 상태이면 앞에서부터 출력
    {
        for (int i = 0; i < deq.size(); ++i)
        {
            cout << deq[i];
            if (i != deq.size() - 1) cout << ",";
        }
    }
    cout << "]\n"; // 결과 배열의 끝 대괄호 출력 및 줄바꿈
}

if (isError): isError 플래그가 true이면 에러 메시지 "error"를 출력합니다.
else: 에러가 발생하지 않았으면 결과를 출력합니다.
결과는 대괄호 []로 감싸진 형태로 출력합니다.


if (isReverse): isReverse가 true이면 데크의 요소를 뒤에서부터 순회하며 출력합니다. 

각 요소 사이에 쉼표,를 출력하되, 마지막 요소 뒤에는 쉼표를 출력하지 않습니다.
else: isReverse가 false이면 데크의 요소를 앞에서부터 순회하며 출력합니다. 마찬가지로 쉼표를 적절히 출력합니다.

 

 

실행 결과

 

'c++' 카테고리의 다른 글

백준 c++ 1620 문제 풀이  (0) 2025.05.11
백준 c++ 10815 문제 풀이  (0) 2025.05.10
백준 c++ 18258 문제 풀이  (0) 2025.05.08
백준 c++ 9012 문제 풀이  (0) 2025.05.07
백준 c++ 14724 문제 풀이  (0) 2025.05.01