Backjoon Online Judge
"5430번 : AC" 문제입니다.
문제 링크 : https://www.acmicpc.net/problem/5430
문제에서 뒤집기 연산을 빠르고 쉽게 수행하기 위해 Deque를 이용하였습니다.
- 일단 최대 100,000개의 p를 한번에 입력받기 위해 100,002 짜리 char형 배열을 선언하였습니다.
(널문자를 고려하여 100,002개 선언)
- 이후 주어지는 배열을 저장하기 위해 400,002 크기의 char형 배열을 선언하였습니다.
((x의 최댓값이 100이므로 구분자(,) 포함)4바이트 * 100,000 + 2 (널문자 & 마지막 구분자))
- 저장 된 배열은 strtok를 이용하여 구분하였고, 구분 된 배열은 atoi함수로 변환하여 저장하였습니다.
(strtok -> cstring, atoi -> cstdlib 라이브러리 이용)
- 계산부분은 뒤집기의 경우 (앞에서 부터 읽도록 / 뒤에서 부터 읽도록) 상호 변환하도록 하였고
버리기의 경우 큐의 맨 앞부분을 POP 하는 방식으로 구현하였습니다.
많은 예외처리로 코드가 다소 복잡합니다.
코드는 C++로 작성하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #include <iostream> #include <cstring> #include <string> #include <queue> #include <cstdlib> using namespace std; int main() { int T, n; char func[100002]; char numTmp[400002]; int lr; //1이면 왼쪽부터, 0이면 에러, -1이면 오른쪽부터 cin >> T; while (T--) { deque<int> dq; lr = 1; cin >> func >> n >> numTmp; //char* context = NULL; //char* num = strtok_s(numTmp, "[],", &context); char *num = strtok(numTmp, "[],"); while(num != NULL) { dq.push_back(atoi(num)); //num = strtok_s(NULL, "[],", &context); num = strtok(NULL, "[],"); } //계산부분 int len = strlen(func); for (int i = 0; i < len; i++) { if (func[i] == 'R') { lr *= -1; } else if (func[i] == 'D') { if (!dq.size()) { lr = 0; break; } if (lr == 1) dq.pop_front(); else dq.pop_back(); } else { cout << "impossible error\n"; return -1; } } //출력부분 if (lr == 0) { cout << "error\n"; } else if (dq.size() == 0) { cout << "[]\n"; } else if (lr == 1) { cout << "["; while (dq.size()-1) { cout << dq.front(); cout << ","; dq.pop_front(); } cout << dq.front() << "]\n"; } else { cout << "["; while (dq.size() - 1) { cout << dq.back(); cout << ","; dq.pop_back(); } cout << dq.back() << "]\n"; } } return 0; }
|
|