정말 풀기 짜증 났던 문제입니다.. 문제의 요지는 R과 D 함수의 내용에 대해 있는 그대로 코딩을 하면 안 됩니다. 시간 초과 때문에 뒤집은 것처럼 원소에 대해 접근하거나 출력해주면 됩니다. 그리고.. 배열을 입력받을 때, 숫자가 3자리까지 입력될 수 있기 때문에 문자 하나하나를 비교해서 배열로 바로 입력해버리면 안 됩니다. 예제 입력으로는 배열의 원소들이 전부 1자리이기 때문에 이런 반례를 발견하기 쉽지 않습니다. 문제 자체의 구현은 어렵지 않으나, 자잘한 실수를 많이 할 수밖에 없는 문제인 것 같습니다 ㅜㅜ..
#include<iostream>
#include<string>
using namespace std;
int front, rear;
bool r, ret;
void inputArray(string arr, int* nums, int size)
{
int len = arr.length();
int idx = 0;
string tmp;
for (int i = 1; i < len; i++) {
if ('0' <= arr[i] && arr[i] <= '9') tmp = tmp + arr[i];
else {
if (tmp != "") {
nums[idx] = stoi(tmp);
tmp = "";
idx++;
}
}
}
}
bool AC(char func)
{
if (func == 'R') r = !r;
else {
if (r) rear--;
else front++;
}
if (front > rear) return false;
return true;
}
void printArray(int* nums)
{
if (!ret) {
cout << "error\n";
return;
}
cout << "[";
if (r) {
for (int i = rear - 1; i >= front; i--) {
cout << nums[i];
if (i != front) cout << ",";
}
}
else {
for (int i = front; i < rear; i++) {
cout << nums[i];
if (i != rear - 1) cout << ",";
}
}
cout << "]\n";
}
int main(void)
{
int t; cin >> t;
string s, arr;
int n;
for (int i = 0; i < t; i++) {
cin >> s >> n >> arr;
int* nums = new int[n];
inputArray(arr, nums, n);
front = 0, rear = n; r = false;
int len = s.length();
for (int j = 0; j < len; j++) {
ret = AC(s[j]);
}
printArray(nums);
}
return 0;
}
배열에 원소를 입력하는 inputArray, R 또는 D 함수를 실행해주는 AC, 배열을 뒤집힌 상태에 따라 출력해주는 printArray 총 3개의 함수를 만들어 구현했습니다. 다만 이상한 점은.. 처음에 AC 함수와 printArray 함수를 아래 코드로 제출했었는데 계속 틀렸다고 나왔습니다. 반례도 찾기 힘들고 눈 씻고 봐도 로직 자체는 같은 것 같은데 어디서 반례가 발생하는지 모르겠네요..
bool AC(char func)
{
if (func == 'R') {
int tmp = front;
front = rear;
rear = tmp;
r = !r;
}
else {
if (r) {
front--;
if (rear > front) return false;
}
else {
front++;
if (front > rear) return false;
}
}
return true;
}
void printArray(int* nums)
{
if (!ret) {
cout << "error\n";
return;
}
cout << "[";
if (r) {
for (int i = front - 1; i >= rear; i--) {
cout << nums[i];
if (i != rear) cout << ",";
}
}
else {
for (int i = front; i < rear; i++) {
cout << nums[i];
if (i != rear - 1) cout << ",";
}
}
cout << "]\n";
}
틀린 부분을 찾으실 땐 아래 링크를 참조하시면 됩니다. djm03178님께서 아주 자세하게 설명해주셨습니다.
'알고리즘 > 백준' 카테고리의 다른 글
[백준/C,C++] 1992번: 쿼드트리 (0) | 2021.03.17 |
---|---|
[백준/C,C++] 2630번: 색종이 만들기 (0) | 2021.03.17 |
[백준/C,C++] 1021번: 회전하는 큐 (0) | 2021.03.16 |
[백준/C,C++] 10866번: 덱 (0) | 2021.03.16 |
[백준/C,C++] 1966번: 프린터 큐 (0) | 2021.03.16 |
댓글