백준 5430(AC)

jh Seo·2022년 11월 9일
1

백준

목록 보기
71/180

개요

백준 5430번: AC

  • 입력
    첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 최대 100이다.

각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어진다. p의 길이는 1보다 크거나 같고, 100,000보다 작거나 같다.

다음 줄에는 배열에 들어있는 수의 개수 n이 주어진다. (0 ≤ n ≤ 100,000)

다음 줄에는 [x1,...,xn]과 같은 형태로 배열에 들어있는 정수가 주어진다. (1 ≤ xi ≤ 100)

전체 테스트 케이스에 주어지는 p의 길이의 합과 n의 합은 70만을 넘지 않는다.

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

접근 방식

  1. 수배열과 커맨드를 string형으로 받아온 후, 각 char형 원소를 조사하여 파싱하는 방법을 사용했다.
  2. 함정조건이 잦아서 매우 시간이 오래걸렸다. 했던 실수들로는
    • 커맨드에 무조건 R과 D가 나온다고 생각했다. -> 예제에서 커맨드가 없는 예제도 있었다.
    • 숫자가 무조건 일의 자리만 나오는 줄 알았다 -> 마찬가지로 예제에 42가 들어있었다.
    • 잦은 실수인데 매번 큐를 선언해주지 않는 이상 큐를 초기화해야한다.
    • 이것도 자주 하는 실수인데, 반복문의 종결조건으로 큐 사이즈를 적어놓고,
      큐에 삽입이나 삭제작업을 하면 중간에 큐 사이즈가 변형되므로 의도한대로 작동 안 된다.
    • 큐가 비어있을 때 커맨드 R을 하는건 에러가 아니다 . D했을때 비어있어야 에러
    • [] 이런 케이스도 있어서, ]를 읽었을때 큐가 비었다면 바로 continue로 끝냈는데
      이래버리니 [13]이렇게 들어와도 ]읽었을때 넣지 않아서 틀렸다.

코드

#include<iostream>
#include<deque>

using namespace std;

int T;
deque<int> q;
string cmd="", num="";


//커맨드에 D가 안나올수도있다
void printAnswer() {
	//초기화 안했다
	bool isDequeBack = true;
	int qNum=0;
	q.clear();
	//num에적힌 수배열 큐에 넣기
	for (int i = 0; i < num.length(); i++) {
		//[이나 ]이면 패스
		if (num[i] == '[' ) {
			continue;
		}
		//,가 나오면 지금까지의 수 큐에 푸시
		else if (num[i] == ','){
			q.push_back(qNum);
			qNum = 0;
		}
		else if (num[i] == ']') {
			//큐가 비었어도 R을 시행한다면 에러가 아니다.
			if (qNum == 0) continue;
			q.push_back(qNum);
			qNum = 0;
		}
		//숫자라면 백의자리나 천의 자리일수 있으므로, 
		else {
			qNum=qNum * 10 + (num[i] - '0');
		}
	}
	//명령 실행
	for (int i = 0; i < cmd.length(); i++) {
		//R이나올때마다 deque의 방향 전환
		if (cmd[i] == 'R') {
			isDequeBack = !isDequeBack;
		}
		else if (q.empty()) {
			cout << "error" << '\n';
			return;
		}
		//dequeBack이면 큐가 정방향 (0번원소가 첫번째 원소)
		else if(isDequeBack) {
			q.pop_front();
		}
		//dequeBack=false면 큐의 방향이 반대(0번원소가 마지막 원소)
		else {
			q.pop_back();
		}
	}
	if (q.empty()) {
		cout << "[" << "]" << '\n';
		return;
	}
	//답 출력 부분
	cout << "[";
	int size = q.size();
	//마지막 하나 전까지 쉼표 출력후
	for (int i = 0; i < size-1; i++) {
		if (isDequeBack) {
			cout << q.front() << ",";
			q.pop_front();
		}
		else {
			cout << q.back() << ",";
			q.pop_back();
		}
	}
	//마지막일때 수 출력하고 ] 출력
	if (isDequeBack) {
		cout << q.front() << "]" << '\n';
	}
	else {
		cout << q.back() << "]" << '\n';
	}
}

void input() {
	cin >> T;
	int tmp=0;
	for (int i = 0; i < T; i++) {
		cin >> cmd >> tmp>>num;
		printAnswer();
	}
}

int main() {
	input();
}

문풀후생

내 실력부족이긴 하지만 너무 함정들도 많았고, 실수한 부분도 많았다.
대표적으로 자료구조나 flag 초기화부분은 자주 까먹는다.
대부분 예제에서 친절하게 알려주긴 했지만 그래도 좀 더 조건들 끝까지 찾아보고
각 끝값에서 작동하는지 체크하는 습관을 들여야하는데 아직 덤벙댄다

profile
코딩 창고!

0개의 댓글