본문 바로가기
백준

[5430] AC

by kmyobin 2023. 1. 31.


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

댓글