https://www.acmicpc.net/problem/5430
5430번: AC
각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.
www.acmicpc.net
AC 욕 나오는 문제이다 ㅎㅎ~
분명 쉬워보였는데 왜 때문에 자꾸 오류가 뜨는건가..
char 배열에서 범위 제한에서 자꾸 틀렸습니다가 나와서 그냥 string으로 바꿨더니 해결되었다.
너무나도 빡침
이 문제를 푸는데 크게 2가지 걸림돌이 있었다.
1. 문자열 parsing
큐 문제에 껴있었으면서 문자열 parsing에서 많이 애먹어서 화남
strtok 함수도 써보았으나 왜때문인지 잘 안돼서
냥 쉼표나 닫히는 대괄호가 들어오면 하나의 정수값을 완성시켰다고 보고 deque에 넣어주었다.
이건 10분만에 해결했는데
2. R 함수
이게 그렇게 복병일 줄이야
질문 게시판을 좀 깔짝대보니 멍청하게 진짜 다 뒤집고 있으면 시간초과 난다고 했다.
시간 제한 1초라서 예상했다.
처음에는 int cnt를 선언해서 R함수가 연속으로 입력될때마다 cnt를 늘려주고, 이를 통해서 R함수를 실행시킬지 말지 결정하려 했는데 또 왜때문인지 잘 안됐다 내가 부족했던 탓이지
그래서 bool reverse로 true, false를 바꿔주면서 해결했다.
reverse가 true이면 기존 배열에서 뒤집혀있다는 뜻이므로 출력할 때 뒤에서부터 출력(pop_back())하였고,
reverse가 false이면 원 상태 그대로라는 뜻이므로 출력할 때 앞에서부터 출력(pop_front())하였다.
근데 이래도 안되길래 p랑 배열 입력받는 자료형을 char->string으로 바꿨더니 해결됨
앞으로 char로 한다고 깝치지말자
#include <iostream>
#include <deque>
#include <cstring>
using namespace std;
int T;
deque<int> mydeq;
bool D(bool reverse) {
// true : 에러 발생 O
// false : 에러 발생 X
if (mydeq.empty()) return true;
else {
// 뒤집혀있으면 맨 뒤가 첫번째 원소인 점을 이용
// 원래 상태면 맨 앞에 첫번째 원소인 점을 이용
if (reverse) mydeq.pop_back();
else mydeq.pop_front();
}
return false;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> T;
for (int i = 0; i < T; i++)
{
string p, arr;
cin >> p;
int n; cin >> n; // 실제로 안쓰였음
cin >> arr;
int num = 0;
// 문자열 parsing 후 deque에 집어넣기
for (int j = 0; j < arr.length(); j++) {
if (arr[j] == ',' || arr[j] == ']') {
// 하나의 정수가 완성된 경우
if (num != 0) mydeq.push_back(num);
num = 0;
}
if (48 <= arr[j] && arr[j] <= 57) {
// 숫자 범위라면
num = num * 10 + (arr[j] - 48);
}
}
bool isError = false;
bool reverse = false; // 배열이 뒤집혀있는지 나타내주는 변수
for (int j = 0; j < p.length(); j++) {
if (p[j] == 'R') {
// 뒤집혀있는 상태에서 뒤집으면 원상복구
// 원래 상태에서 뒤집으면 뒤집혀있는 상태
reverse = !reverse;
}
else {
isError = D(reverse);
if (isError) break;
}
}
if (isError) cout << "error\n";
else {
cout << "[";
if (!reverse) {
// 뒤집혀 있지 않다면 앞부터 출력
while (1) {
if (mydeq.empty()) { cout << "]\n"; break; }
cout << mydeq.front();
mydeq.pop_front();
if (!mydeq.empty())cout << ",";
}
}
else {
// 뒤집혀 있다면 뒤부터 출력
while (1) {
if (mydeq.empty()) { cout << "]\n"; break; }
cout << mydeq.back();
mydeq.pop_back();
if (!mydeq.empty())cout << ",";
}
}
}
}
}
'백준' 카테고리의 다른 글
[1992] 쿼드트리 (0) | 2023.02.04 |
---|---|
[1780] 종이의 개수 (0) | 2023.02.03 |
[1021] 회전하는 큐 (0) | 2023.01.30 |
[1966] 프린터 큐 (0) | 2023.01.26 |
[11866] 요세푸스 문제 0 (0) | 2023.01.26 |
댓글