본문 바로가기

Algorithm/Baekjoon BOJ

[백준][C++] 5430: AC

반응형

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

 

5430번: AC

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

www.acmicpc.net

 

 

 

 

 


- 문제

 

[1,2,3,4] 와 같은 정수의 배열이 주어지면 R(앞뒤 뒤집기), D(앞 혹은 뒤의 숫자 한 개 제거하기)와 같은 방법을 통해 최종 배열을 출력하는 문제다.

 

 

 


- 해설

 

문제를 보자마자 deque를 써야겠다는 생각을 하지 못하고 다른 방법을 생각했으면 좀 더 기초를 쌓고 와야한다고 생각한다.(자료구조)

 

물론 다른 방법으로 풀 수 있는 사람들도 있을텐데, 그건 진짜 상위권에 있는 사람들만 해당되고, 그런 사람들은 내 글을 보지 않을테니, 예외로 두자.

 

deque를 쓰지 않고 R이 나올때마다 진짜로 배열을 뒤집었다면 무조건 시간초과가 나올거라고 생각한다.

 

 

 

 

 

 

 

신경써야 할 부분이 몇 가지 있다.

 

1. [1,2,34,43]에서 1, 2, 34, 43을 어떻게 뽑아낼것인가

 

2. R이 주어졌을 때 어떻게 뒤집을것인가

 

3. D가 주어졌을 때 어떻게 숫자를 뺄것인가

 

4. 최종 출력을 어떻게 할 것인가

 

 

1) string temp를 만들고

숫자가 이어지면 temp += p[i]를 통해 숫자를 이어붙이고 숫자가 아니면 끝낸다.

 

 

2) isReverse 혹은 isFront와 같은 boolean을 만들어서 방향을 특정한다.

 

 

3) isFront를 이용해서 방향을 특정해낸 다음에, 방향에 맞게 pop한다.(deque라 가능)

 

 

4) ,를 출력하는게 가장 힘들었는데, deque에 남은게 없으면 ,를 출력하지 않도록 하면 된다.

 


 

- 풀이

#include <iostream>
#include <string>
#include <deque>
using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int T, n;
    string p, x, tempS;
    char tempC;
    bool isFront = true, isError = false;

    cin >> T;
    for (int i = 0; i < T; i++)
    {
        isFront = true;  // 앞에서 시작인지, 뒤에서 시작인지 (R)
        isError = false; // Error 판별
        deque<int> dq;
        cin >> p;
        cin >> n;
        cin >> x;

        for (int i = 0; i < x.size(); i++) // 1.
        {
            if (isdigit(x[i]))
            {
                tempS += x[i]; // 십의자리가 나올수도 있으므로 저장
            }
            else
            {
                if (!tempS.empty())
                {
                    dq.push_back(stoi(tempS)); // 숫자만 저장
                    tempS.clear();
                }
            }
        }
        for (int i = 0; i < p.size(); i++)
        {
            tempC = p[i];
            if (tempC == 'R') // 2. R이면 앞뒤반전
            {
                isFront = !isFront;
            }
            else if (tempC == 'D') // 3. D이면 비었을 경우 error, 아니면 isFront에 따라 앞 혹은 뒤에서 하나씩 삭제
            {
                if (dq.empty())
                {
                    cout << "error\n";
                    isError = true;
                    break;
                }
                else
                {
                    if (isFront)
                    {
                        dq.pop_front();
                    }
                    else
                    {
                        dq.pop_back();
                    }
                }
            }
        }
        if (!isError) // 4.
        {
            cout << "[";
            while (!dq.empty())
            {
                if (isFront)
                {
                    cout << dq.front();
                    dq.pop_front();
                }
                else
                {
                    cout << dq.back();
                    dq.pop_back();
                }
                if (!dq.empty())
                {
                    cout << ',';
                }
            }
            cout << "]" << '\n';
        }
    }

    return 0;
}
반응형

'Algorithm > Baekjoon BOJ' 카테고리의 다른 글

[백준][C++] 11401: 이항 계수 3  (0) 2022.12.08
[백준][C++] 2740: 행렬 곱셈  (0) 2022.11.21
[백준][C++] 1931: 회의실 배정  (0) 2022.11.15
[백준][C++] 13305: 주유소  (0) 2022.11.14
[백준][C++] 10986: 나머지 합  (0) 2022.11.14