Stargazer

[백준] 5430번 : AC (deque (or vector)) 본문

Undergraudate basics(학부생 기초)/자료구조, 알고리즘

[백준] 5430번 : AC (deque (or vector))

COM2IT 2022. 7. 9. 14:45
반응형

얼떨결에 두 번 풀어가지고, 해답을 두번 올리겠다.

 

접근:

뒤집기 - 순서만 바꿔서 출력하면 됨

삭제 - 뒤집은 상태에 따라 앞뒤 판단만 잘해서 하나씩 삭제 하면됨

 

전략:

먼저 주어진 데이터를 split해서 실제 배열 변수로 저장한다.

1. deque를 이용한 방법

- 현재 상태에 따라 앞뒤 구분해서 pop_front, pop_back을 방향에 맞게 제거하고, 출력할 때 방향에 맞게 출력 하면 된다.

 

2. vector를 이용한 방법

- 실제 제거는 하지 않고, 주어진 배열 양 끝 인덱스(left, right) 를 지정하고, 범위를 명령에 맞게 앞 또는 뒤를 하나씩 좁힌다. 출력은 위와 같이 방향에 맞게 출력하면 된다.

 

코드:

*두 코드 작성 시점이 거리가 있어서 스킬이 조금씩 다르니 각각 참고하는 것도 좋을 것 같다.

 

1. deque 이용하기

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <deque>
using namespace std;
//vector<int> list;
deque<int> dq;
bool r = false;
bool ending = false;

// R: 뒤집기, D: 버리기
void R() {
	r = !r;
}
void D() {
	if (dq.empty()) {
		cout << "error" << '\n';
		ending = true;
	}
	else if (r) {
		dq.pop_back();
	}
	else {
		dq.pop_front();
	}
}

void command(string& cmd) {
	for (char& c : cmd) {
		switch (c) {
		case 'R':
			R();
			break;
		case 'D':
			D();
			break;
		}
		if (ending) return;
	}
	
}

void seplist(string& input) {
	dq.clear();
	string temp ="";
	for (auto& i : input) {
		if (i == '[') continue;
		if (i == ',' || i==']') {
			if(!temp.empty())
			dq.push_back(stoi(temp));	
			temp.clear();
		}
		else {
			temp += i;
		}
	}
}

int main() {
	int t;
	int size;
	string cmd, input;
	cin.tie(NULL);
	ios::sync_with_stdio(false);

	cin >> t;
	for (int i = 0; i < t; i++) {
		cin >> cmd;
		cin >> size;
		cin >> input;

		ending = false;
		r = false;

		seplist(input);
		command(cmd);

		if (ending) continue;

		cout << '[';

		for (int j = 0; j < dq.size();j++) {
			if (r) {
				cout << dq[dq.size() - j -1];
			}
			else {
				cout << dq[j];
			}
				
			if (j == dq.size() - 1) {
				break;
			}
			else
			{
				cout << ',';
			}
		}
		cout << ']' << '\n';
	}
	return 0;
}

2. vector를 이용한 방법

#include <iostream>
#include <vector>
using namespace std;
int t;

int main(){
    cin >> t;
    for(int test=0;test<t;test++){
        string oper;
        cin >> oper;

        int n;
        cin >> n;

        string arr;
        cin >> arr;

        vector<int> array;

        int i = 1;
        int sum = 0;

        while(i<arr.size()){
            if(arr[i] == ','){
                array.push_back(sum);
                sum=0;
                i++;
            }
            else if(arr[i] == ']'){
                if(arr[i-1] == '[') break;
                array.push_back(sum);
                break;
            }
            else{
                sum *= 10;
                sum += (arr[i] - '0');
                i++;
            }
        }

        int dir = 1; // 1: right, -1 : left
        int left = 0;
        int right = array.size() - 1;
        bool flag = false;
        for(auto op : oper){
            if(op == 'R'){
                dir *= -1;
            }else{ //
                if(n==0){
                    cout << "error" << '\n';
                    flag=true;
                    break;
                }
                
                if(dir == 1){
                    left++;

                }else{
                    right--;
                }

                n--;
            }

        }
        if(flag) continue;
        else if (n == 0) {
            cout << "[]"<<'\n';
            continue;
        }

        cout << '[';

            if(dir == 1){
                for(int i = left; i < right; i++)
                    cout << array[i] << ',';
            }else{
                for(int i = right; i > left; i--)
                    cout << array[i] << ',';
            }

        if(dir == 1){
                cout << array[right];
        }else{
                cout << array[left];
        }
        cout << ']' <<'\n';
    }
    return 0;
}

 

반응형
Comments