문제 링크 : 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 |