[BOJ - 5430] AC

박재민·2023년 3월 29일
0

알고리즘

목록 보기
6/8

💡문제 한마디

단계별 풀기에서 덱 문제라길래 이게 왜 어렵지 했으나, 알고보니 파싱, 문자열 문제였다...

👉문제 링크

AC

🖥️ 코드

#include <iostream>
#include <deque>
#include <string>


using namespace std;

int main(void){
  int T,N;
  string tem,arr,ans;
  deque<int> d;
  bool f=true;
  bool e= false;
  cin >> T;

  for(int i=0;i<T;i++){
    //초기화 함수
    f= true;
    e=false;
    d.clear();
    tem.clear();
    arr.clear();
    cin >> tem >> N >> arr;

    // 파싱함수
    for(int j=1;']'!=arr[j];j++){
      if(arr[j]==','){
        d.push_back(stoi(ans));
        ans.clear();
        continue;
      }
      ans.push_back(arr[j]);
    }
    if(ans.length()!=0){
      d.push_back(stoi(ans));
      ans.clear();
    }

    // R,D 입력하는 함수
    for(int j=0;j<tem.length();j++){
      if(tem[j]=='D'){ // D 일 경우
        if(d.size()==0){ // deque가 비어있으면 error를 출력해야 하므로 e여부 확인하는 boolean을 true로 처리
          e=true;
          break;
        }
        if(f){ // front인지 여부 확인하는 f가 true일 경우 앞 부분 삭제
          d.pop_front();
          continue;
        }
        d.pop_back(); // 아니면 뒷 부분 삭제
        
      }
      else{ // R이 나올 경우
        f= !f; // front의 여부를 확인하는 f 변수를 반대로 바꿔준다.
      }
    }

    int D_SIZE = d.size();

    // 출력하는 함수
    if(e){
      cout << "error" << '\n';
    }
    else{
      cout << '[';
        if(f){
          for(int idx =0;idx<D_SIZE;idx++){
            cout << d[idx];
            if(idx != (D_SIZE-1)){
              printf(",");
            }
          }
        }
        else{
          for(int idx =(D_SIZE-1);idx>=0;idx--){
            cout << d[idx];
            if(idx != 0){
              printf(",");
            }
          }
        }
      cout << ']' << '\n';
    }
  }
}

📎풀이

풀이 생략
1. 첫 초기화하는 부분과, T에 따른 반복은 생략함.
2. R,D는 단순 조건에 따른 처리이므로 주석으로 처리


	for(int j=1;']'!=arr[j];j++){
      if(arr[j]==','){
        d.push_back(stoi(ans));
        ans.clear();
        continue;
      }
      ans.push_back(arr[j]);
    }
    if(ans.length()!=0){
      d.push_back(stoi(ans));
      ans.clear();
    }

arr[j] == "[1,2,3,4,5]"

  • arr[j]는 문자열로 처리되어 있고, 각 원소는 ','로 구분되어 있음.
  • 따라서 ','가 나올 때마다 ans라는 정수값을 가지는 문자열 ex)"123" 을 deque에 push_back해줌.
  • 마지막 원소 같은 경우는 ','가 없으므로 ans라는 문자열이 존재할 경우에만 push해줌.(문자열이 존재하지 않을 때 push해줄 경우에도 빈 값이 push 됨).

	int D_SIZE = d.size();

    if(e){ // error일 경우
      cout << "error" << '\n';
    }
    else{ // error가 아닐 경우
      cout << '[';
        if(f){ // front부터 시작해야 할 경우
          for(int idx =0;idx<D_SIZE;idx++){
            cout << d[idx];
            if(idx != (D_SIZE-1)){
              printf(","); // 각 원소가 나올 때 마다 ','가 나와야 함. + 마지막 원소일 때는 나오면 안됨.
            }
          }
        }
        else{ // back 부터 시작해야 할 경우
          for(int idx =(D_SIZE-1);idx>=0;idx--){
            cout << d[idx];
            if(idx != 0){
              printf(","); // 각 원소가 나올 때 마다 ','가 나와야 함. + 마지막 원소일 때는 나오면 안됨.
            }
          }
        }
      cout << ']' << '\n';
    }
  • 기존 배열을 문자열로 파싱하는 코드
  • 기존 코드에서는 반복문 조건에서 idx<D_SIZE가 아니라 for(;d.size();)형태로 구현하니 시간이 너무 많이 걸려서 바꿨음.

📖배운 점

  1. c++에서 제공하는 함수들을 너무 남용하지 말자. (시간이 더 걸림)
  2. 파싱 문제 에서 중요한 것은 너무 쉽게쉽게 가려하지 않기 (대부분 일일이 처리해주어야 하므로 조건 하나하나씩 잘 챙겨가면서 하기)
  3. deque를 굳이 안 쓰고, vector를 사용해서 front,back를 가리키는 변수만 사용해서 더 깔끔하게 구현할 수 있음.
profile
Newbie Developer

0개의 댓글