본문 바로가기
baekjoon

[문자열] 백준 5430 AC C++

by HomieKim 2022. 1. 24.

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

[5430번: AC

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

www.acmicpc.net](https://www.acmicpc.net/problem/5430)



풀이 :

문제만 읽었을 때 쉬워보여서 금방 풀었는데 에러가 나서 고친부분이 많음 조금 디테일하게 생각해야할 부분이 조금 있다.

 

문제의 핵심을 크게 나누어 보면

  1.  [1,2,3,4] 이런 식으로 입력되는 배열을 다루기 쉽게 파싱하는 부분
  2.  R -> 해당 배열을 뒤집는 부분
  3.  D -> 첫번째 원소를 삭제하는 부분

이렇게 3가지 정도로 나눌 수 있는데 가장 큰 핵심은 2번 뒤집는 부분이였다.

 

각 부분별로 내가 해결한 방법은

1. deque 을 사용해 안에 내용물만 문자열 형태로 파싱후 리턴해 준다.

여기서 처음에 vector로 사용했는데 D를 구현할 때 맨 앞에 원소를 삭제해야 하기 때문에 deque가 편하다고 생각해서 사용했다. 다 풀고 알았는데 vector로 앞원소를 삭제하려고 구현하면 해당원소를 삭제 후 모든 원소를 한칸씩 땡겨야 되서 시간초과가 난다고 한다. 안에 데이터를 int형으로 바꿔서 해도 풀 수 있을 것 같은데 계산하는 로직이 없이 그냥 출력만 하면 되니까 문자열로 사용

 

2. 여기가 핵심인데 리턴 받은 deque의 원소를 뒤집어 줘야한다. 근데 하나하나 뒤집는 방법으로 구현하면 시간초과 난다.(주석 처리한 부분) 즉, 원소를 전부 뒤집지 않고 뒤집은 것 처럼 사용해야함. reverse변수를 두고 반대 되는 상황이면 -1 아니면 1로 두고 처리함

 

3. 여기도 에러가 몇개 있었는데 우선 기본적인 로직은 리버스 상황일때는 뒤에서 pop해주고 정상 순서일때는 원래 D명령이 앞을 지우는 거니까 앞에서 pop해주면 됨,

조심해야 되는 점은 deque이 비어있을 때 D명령이 들어오면 error를 출력해야함. 결과가 빈배열이면 빈배열 그대로 출력해야한다.

예를 들어

input :

1

R

0

[]

인 경우

output :

[]

이렇게 나와야됨

 

위 3개만 조심하면 나머지는 요구사항에 맞춰서 출력해주면 된다!

코드 :

#include <iostream>
#include <deque>

using namespace std;

int T, n;
string query, strArr;
// string로 바꾸고 parsing 하는 부분 수정하면 될듯
deque<string> parseArr(string strArr) {
    deque<string> tmpDeq = {};
    string tmpStr = "";
    for (auto c : strArr) {
        if (c == '[') {
            continue;
        }
        else if (c == ','  || c == ']') {
            if (tmpStr != "") {
                tmpDeq.push_back(tmpStr);
                tmpStr = "";
            }
        }
        else {
            tmpStr += c;
        }
    }
    return tmpDeq;
}

//deque<string> reverseDeq(deque<string> deq) {
//    deque<string> tmpDeq = {};
//    int deqSize = deq.size();
//    for (int i = deqSize - 1; i >= 0; i--) {
//        tmpDeq.push_back(deq[i]);
//    }
//    return tmpDeq;
//}

void printDeq(deque<string> deq, int reverse) {

    int size_ = deq.size();
    if (size_ == 0) {
        cout << "[]" << '\n';
    }
    else {
        cout << '[';
        if (reverse == -1) {
            for (int i = size_ - 1; i >= 0; i--) {
                if (i == 0) {
                    cout << deq[i];
                }
                else {
                    cout << deq[i] << ',';
                }
            }
        }
        else {
            for (int i = 0; i < size_; i++) {
                if (i == size_ - 1) {
                    cout << deq[i];
                }
                else {
                    cout << deq[i] << ',';
                }
            }
        }
        cout << ']' << '\n';
    }

}


void solve(string query, int n, string strArr) {

    deque<string> deq = parseArr(strArr);
    int reverse = 1;

    for (char c : query) {
        if (c == 'R') {
            reverse *= -1;
        }
        else {
            if (deq.empty()) {
                cout << "error" << '\n';
                return;
            }
            else {
                if (reverse == -1) {
                    deq.pop_back();
                }
                else {
                    deq.pop_front();
                }

            }
        }
    }

    printDeq(deq, reverse);
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> T;
    while (T--) {
        cin >> query;
        cin >> n;
        cin >> strArr;
        solve(query, n, strArr);
    }
}

'baekjoon' 카테고리의 다른 글

[DP] 백준 1699 제곱수의 합 C++  (0) 2022.01.26
[DP] 백준 2294 동전2 C++  (0) 2022.01.25
[그리디] 백준 4796 캠핑 C++  (0) 2021.09.02
[DP] 백준 2225 합분해 C++  (0) 2021.09.01
[이분탐색] 백준 1920 수찾기 C++  (0) 2021.08.30

댓글