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) 참고자료
'Problem Solving > 백준' 카테고리의 다른 글
[백준/c++] 4889 - 안정적인 문자열 (0) | 2021.03.05 |
---|---|
[백준/c++] 4949 - 균형잡힌 세상 (0) | 2021.03.04 |
[백준/c++] 2164 - 카드2 (0) | 2021.03.02 |
[백준/c++] 1021 - 회전하는 큐 (0) | 2021.03.01 |
[백준/c++] 1874 - 스택 수열 (0) | 2021.02.25 |