본문 바로가기
문제 풀이/백준(BOJ)

[C++] 백준 5430번 : AC

by 희조당 2021. 7. 26.
728x90

https://www.acmicpc.net/problem/5430

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net


 문제 풀이

이 문제에서 포인트는 세 가지로 나누어 볼 수 있다.

 1. string을 입력받아서 덱에 저장

 2. 에러가 발생하는 조건

 3. 시간제한이 단 1초

 

입력받은 숫자들은 string이므로 stoi 함수를 사용해서 int로 변환해주어야 한다. 

주의할 점은 단순히 isdigit으로 숫자인지 아닌지 분류한다면 두 자리 이상의 수를 제대로 덱으로 가져올 수 없다.

따라서 콤마( , )와 닫는 괄호 ( ] )가 등장한다면 int로 변환해서 덱에 push 해야 한다.

 

에러가 발생하는 조건은 "배열이 비어있는데 D를 사용한 경우"이다. 

단순히 넘어갈 수도 있지만 "덱이 비어있을 때 에러가 발생한다."라고 착각할 수 있기에 짚고 넘어가야 한다.

 

가능한 input의 수는 Test_Case는 100가지, 명령어 100,000가지, 배열에 들어가는 수 100,000가지로

단순하게 접근하면 무조건 시간 초과가 발생한다!

시간을 줄이기 위해서는 뒤집기(R)를 실행하지 않아야 한다.

뒤집어진 상태를 나타내는 flag를 만들어서 접근하면 시간을 엄청나게 줄일 수 있다.

 느낀 점

생각했던 구현은 모두 맞았고 제대로 구현했다. 단순한 디테일들이 부족했었다. 부족했던 디테일들은 위에 적었던 것들이다. 이 정도 수준의 문제가 재밌고 유익한 정도의 수준의 문제들인 것 같다.

 코드

#include <iostream>
#include <deque>
#include <string>

using namespace std;

int t, n;
string command, arr, tmp;

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	
	cin >> t;
	while (t--) {
		deque<int> dq;
		bool isReverse = false;
		bool isError = false;
		cin >> command >> n >> arr;

		for (int i = 0; i < arr.size();i++) {
			if (arr[i] == ',' || arr[i] == ']') {
				if (!tmp.empty()) {
					dq.push_back(stoi(tmp));
					tmp = "";
				}
			}
			if (isdigit(arr[i])) 
				tmp += arr[i];
		}

		for (int i = 0; i < command.size();i++) {
			if (command[i] == 'R') isReverse = !isReverse;
			else {
				if (dq.empty()) isError = true;
				else {
					if (isReverse) dq.pop_back();
					else dq.pop_front();
				}
			}
		}

		if (isError) cout << "error\n";
		else {
			int size = dq.size();
			cout << "[";
			if (isReverse) {
				for (int i = 0; i < size;i++) {
					cout << dq.back();
					dq.pop_back();
					if (!dq.empty()) cout << ",";
				}
			}
			else {
				for (int i = 0; i < size;i++) {
					cout << dq.front();
					dq.pop_front();
					if (!dq.empty()) cout << ",";
				}
			}
			cout << "]\n";
		}
	}
}

댓글