본문 바로가기
알고리즘/백준

[백준/C,C++] 5430번: AC

by 이민훈 2021. 3. 16.

www.acmicpc.net/problem/5430

 

5430번: AC

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

www.acmicpc.net

정말 풀기 짜증 났던 문제입니다.. 문제의 요지는 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님께서 아주 자세하게 설명해주셨습니다.

www.acmicpc.net/board/view/25456

 

글 읽기 - ★☆★☆★ [필독] AC FAQ ★☆★☆★

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

댓글