[백준] AC 5430

Soohyeon B·2022년 11월 11일
0

알고리즘 문제 풀이

목록 보기
39/70

문제

  • R: 배열의 순서 뒤집기
  • D: 첫 번째 수 버리기 (배열이 비어있을 경우 에러)
    정수 배열과 수행할 함수가 주어졌을 때 함수를 수행한 결과를 출력한다.

입력 예제

T: 4
	p: RDD
	n: 4
	[1,2,3,4]
    
	DD
	1
	[42]
    
	RRD
	6
	[1,1,2,3,5,8]
    
	D
	0
	[]

풀이

#include <bits/stdc++.h>
using namespace std;

int main (void){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int T, n; //테스트케이스 개수
    string p;
    deque <int> D;
    
    cin >> T; //4
    
    
    while(T--){
        cin >> p; //수행함수 rdd
        cin >> n; //배열 안에 들어있는 수의 개수 4
        
        //배열 입력 받기
        string arr;
        cin >> arr;
        
        //입력받은 배열에서 숫자만 덱에 넣기
        for(char c:arr){ //42
            if(c =='[' || c ==',' || c ==']') continue;
            else D.push_back(c-'0'); // 1 2 3 4
        }
    
        //함수 수행
        for(char c:p){ //rdd dd
            if(c=='R'){
                reverse(D.begin(), D.end()); //4 3 2 1
            }
            else{ //D
                if(D.empty()) cout << "error\n"; 
                else D.pop_front(); //3 2 1 , 2 1
            }
        }
        //수행결과 출력
        for(int i=0; i<D.size(); i++) cout << D[i]<<' ';
    }
    
    
    return 0;
}


  • 두자리 수 이상을 제대로 저장하지 못함

풀이 2 - parse()이용

#include <bits/stdc++.h>
using namespace std;

int main (void){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int T, n; //테스트케이스 개수
    string p;
    deque <int> dq;
    
    cin >> T; //4
    
    
    while(T--){
        cin >> p; //수행함수 rdd
        cin >> n; //배열 안에 들어있는 수의 개수 4
        
        //배열 입력 받기
        string arr;
        cin >> arr;
        
        int cur = 0;
        for(int i = 1; i+1 < arr.size(); i++){
            if(arr[i] == ','){
              dq.push_back(cur);
              cur = 0;
            }
            else{
              cur = 10 * cur + (arr[i] - '0');
            }
        }
        if(cur != 0)
            dq.push_back(cur);
        
    
        //함수 수행
        for(char c:p){ //rdd dd
            if(c=='R'){
                reverse(dq.begin(), dq.end()); //4 3 2 1
            }
            else{ //D
                if(dq.empty()) {cout << "error\n"; continue; }
                else dq.pop_front(); //3 2 1 , 2 1
            }
        }
        //수행결과 출력
        cout << '[';
        for(int i=0; i<dq.size(); i++) cout << dq[i]<<',';
        cout << "]\n";
    }
    
    
    return 0;
}

풀이3 - 지원 풀이 [맞음]

R이면 뒤에서 삭제하고 뒤에서 읽는 코드

#include <bits/stdc++.h>
using namespace std;

int T, n;
bool isError = false, isReverse = false;
string p, arr;
vector<string>v;

deque<string> DQ;

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> T;

    while (T--) {
        cin >> p >> n >> arr;
        arr = arr.substr(1, arr.size()-2);
        istringstream ss(arr);
        while (getline(ss, arr, ','))
        {
            DQ.push_back(arr);
        }

        for (auto c : p) {
            if (c == 'R') {
                isReverse = !isReverse;
            }
            else {
                if (!DQ.empty()) {
                    if (isReverse) DQ.pop_back();
                    else DQ.pop_front();
                }
                else {
                    cout << "error" << "\n";
                    isError = true;
                    break;
                }
            }
        }
        if (!isError) {
            cout << "[";
            if (isReverse) {
                for (int i = 0; i < DQ.size(); i++) {
                    cout << DQ[DQ.size() - 1 - i];
                    if (i != DQ.size() - 1) cout << ",";
                }
            }
            else {
                for (int i = 0; i < DQ.size(); i++) {
                    cout << DQ[i];
                    if (i != DQ.size() - 1) cout << ",";
                }
            }
            cout << "]\n";
        }

        isError = false;
        isReverse = false;
        DQ = deque<string>();
    }
}

풀이 4 - reverse를 구현한 풀이 [틀림]

#include <bits/stdc++.h>
using namespace std;

int main (void){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int T, n; //테스트케이스 개수
    string p;
    cin >> T; //4
    
    
    while(T--){
        cin >> p; //수행함수 d
        cin >> n; //배열 안에 들어있는 수의 개수 0
        deque <int> dq;
        int flag =0;
        
        //배열 입력 받기
        string arr;
        cin >> arr; //[]
        
        int cur = 0;
        
        //[]
        for(int i = 1; i < arr.size(); i++){ //D
            if(arr[i] == ',' || (arr[i]==']'&& cur!=0) ){
              dq.push_back(cur); //dq = 1 2 3 4
              cur = 0;
            }
            else{ 
              cur = 10 * cur + (arr[i] - '0');
            }
        }
    
        //함수 수행
        for(char c:p){ //d
            if(c=='R'){
                // 1 2 3 4 4 3 2 1
                int sz = dq.size(); //4
                for(int i=sz-1; i>=0; i--){
                    dq.push_back(dq[i]);
                }
                sz = dq.size()/2;
                for(int i=0; i<sz; i++)
                    dq.pop_front();
            }
            else{ //D
                if(dq.empty()) {cout << "error\n"; flag=1; continue; }
                else dq.pop_front(); //3 2 1 , 2 1
            }
        }
        
        //수행결과 출력
        if(!flag){
            cout << '['; //2 1
            for(int i=0; i<dq.size(); i++) {
                if(i ==dq.size()-1) cout << dq[i]<<"]\n";
                else cout << dq[i]<<',';
            }
        }
        
    }
    
    
    return 0;
}
profile
하루하루 성장하는 BE 개발자

0개의 댓글