Problem Solving/백준

[백준/c++] 5430 - AC

세고래 2021. 3. 4. 04:08

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

 

5430번: AC

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

www.acmicpc.net


1) 풀이

이 문제를 풀면서 까다롭다고 생각한 부분을 정리해보았다.

 

1) R(배열을 뒤집는 함수)

: 진짜 배열전체를 거꾸로 뒤집으려면 연산을 너무 많이 진행해야 하므로,

해당 명령어가 나올 때마다 그냥 뒤집은 척만 해준다!

»배열의 앞뒤가 바뀌어버리는 것과 같으므로,

현재 배열의 앞이 front인지 back인지 가리키는 변수를 선언하고

(ex. 한 번 뒤집어졌다면 배열의 앞은 back)

R 명령어가 나올때마다 바꿔준다.

 

2) D(배열의 첫번째 숫자를 버리는 함수)

: 배열이 비어있을 때, D를 수행하면 "error"를 출력하도록 처리해야한다.

: 현재 배열의 앞이 어딘지 확인한 다음, 

적절하게 pop_front와 pop_back을 실행해야 한다. 

(앞뒤로 모두 pop을 진행해줘야 하므로 덱을 사용한다)

 

3) n개의 수가 들어간 배열

: ' [x1,...,xn]과 같은 형태' 로 입력해야 하므로,

즉 [],와 같은 문자들과 함께 입력해주어야 하므로

n크기의 int형 배열이 아닌, char형 배열을 만들어야 한다.

: int가 아닌, char 형으로 입력하기 때문에 배열 내의 하나의 요소가 한글자가 아닐 수 있다!

 

문제를 풀다가 답답한 마음에 질문게시판에 가보니,

문제 자체가 고려해야 하는 요소가 많아서도 있는 것 같지만

특히 3) 을 생각하지 못해서 틀리는 경우가 많아 보였다 !

왜냐면 난 예전에 푼 문제였는데도 저걸 생각 못했기 때문 😅

 

그래서 3)에 대해서 좀 자세히 기록해놓고자 한다!

혹시나 잘못되거나 짚고 넘어가지 않은 부분을 발견하신다면

댓글로 알려주시면 감사하겠습니다 :)

 

  • 배열에 들어있는 총 개수 n의 최대 크기는 100,000
  • 배열에 들어있는 수의 최대 크기는 100 (세자리수)

여기에서 주의할 점은, 우리가 수를 저장하는 배열은

char 배열이기 때문에 숫자를 입력할시, 하나씩 따로 저장된다!

(ex. 100-> 1, 0, 0 으로 한글자씩 떼서 저장됨)

 

또한, 우리는 [](2개)와 ,(n-1개)의 문자까지 모두 이 배열에 입력해야 한다.

 

그러므로, char 배열의 크기는 아무리 작아도

(100,000*3)+((2+(100,000-1))=400,001

400,001의 크기 이상으로 지정되어야 한다!

*숫자만 고려한 배열 크기

*[],의 개수를 고려한 크기

 

여기까지 모두 고려해서 코드를 짰으나,

멍청하게 중간에 💥error 처리💥를 잘못해줘서 시간을 허비했다!!!!!!!!!

 

input이 다 들어가기도 전에 프로그램이 종료되어서 애를 먹었는데

알고보니 error를 출력하고 바로 return 0을 해줬기 때문....

그걸 바르게 고치니까 바로 정답이 나왔다!

* 혹시 이것 외의 문제가 있다면 아래의 참고자료 링크로 가서 답변을 참고해보아도 좋을 것 같다!

2) 최종 소스코드
#include <bits/stdc++.h>
using namespace std;
int t;
int n; //배열크기
string p; //명령어
char arr[400005]; //배열을 저장하는 char형 배열
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> t;
	for(int i=0;i<t;i++){
		fill(arr, arr + 400005, NULL); //배열 초기화
		cin >> p>>n>>arr;
		deque<int>d; //배열에서 숫자를 추출해내 저장할 덱
		int sum = 0;
		for (auto c : arr) {
			if (c == NULL) break;
			if (c == '[') continue; 
			if (c == ',' || c == ']') {
				if (sum != 0) {
					d.push_back(sum);
					sum = 0;
					continue;
				}
			}
			sum *= 10; 
			sum += c-'0';
		}
		bool beg = 1; //지금 배열의 앞이 어딘지 가리키는 변수.
       	//1:front를 가리킴
		//0: back을 가리킴
		bool error = 0; // 배열이 비어있을때 D를 수행할시 error를 출력하기 위함
		
		for (auto c : p) {
			if (c == 'R') {
				if (beg == 1) {
					beg = 0;
				}
				else beg = 1;
			}
			else if (c == 'D') {
				if (d.empty()) {
					error = 1;
				}
				else {
					if (beg == 1) {
						d.pop_front();
					}
					else if (beg == 0) {
						d.pop_back();
					}
				}
			}
		}
		if (error == 1) {
				cout << "error" << '\n';
				continue;
		}
		if (beg == 1) {
			deque<int>::iterator iter;
			cout << "[";
			for (iter = d.begin(); iter != d.end(); iter++) {
				cout << *iter;
				if (iter == d.end()-1) break;
				cout << ",";

			}
			cout << "]" << '\n';
		}
		else {
			deque<int>::reverse_iterator iter; 
			cout << "[";
			for (iter = d.rbegin(); iter != d.rend(); iter++) {
				cout << *iter;
				if (iter == d.rend()-1) break;
				cout << ",";

			}
			cout << "]" << '\n';
		}
	}
}
3) 참고자료

www.acmicpc.net/board/view/25456

728x90