ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 5430) AC c++
    백준코딩일기 2020. 11. 5. 11:59

    문제 ) www.acmicpc.net/problem/5430

     

    5430번: AC

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

    www.acmicpc.net

     

    풀이 ) 

    int T = 테스트 케이스 수
    string cmd = 수행할 함수
    int n = 배열에 들어있는 수의 개수
    string arr = 입력받는 배열
    int tmp = 입력받은 배열의 원소 하나를 임시 저장
    bool isReverse = cmd 로 입력받은 문자중 'R'이 있다면 뒤집는지 여부를 확인하기 위함
    bool isDelete = cmd 로 입력받은 문자중 'D'가 있다면 맨 앞 문자를 지울지 확인하기 위함

    1. 입력받은 배열에서 맨 앞 대괄호 지우기

    ex). [1,2,3,4] 이런식으로 입력이 되어서 맨 앞에 '[' 이 부분 지우기

    arr = arr.substr(1, arr.size() - 1);

     

    2. 숫자라면 덱에 push_back 을 이용해서 순차적으로 덱에 넣기

    콤마(,) 또는 오른쪽 대괄호 ']' 를 만나고 tmp 가 비어있다면 덱에 넣고,
    아니라면 tmp 임시 저장 변수에 arr[i] 를 이어 붙인다.

    if( (arr[i] == ',' || arr[i] == ']') && tmp != "" ){
    	dq.push_back(atoi(tmp.c_str()));
    	tmp = "";
    }
    
    else 
    	tmp += arr[i];

     

    3. cmd 로 함수를 입력받아서 R과 D의 함수 처리하기

    'R'을 만나면 isReverse 의 boolean 값을 반대로 바꾸어준다.
    --> 만약 입력받은 함수가 RR 이라면 원래대로 돌려야하기 때문에 이 연산을 줄이기 위함

    R 이 아닌경우는 D 밖에 없으므로, else 로 처리했다.

    덱이 비어있다면, 더이상 지울 것이 없으므로 isDelete 값을 true 로 바꾸고 멈춤.
    만약 덱이 비어있지 않다면,
    isReverse 의 값에 따라서 앞에서부터 덱의 원소를 빼내거나 뒤에서부터 빼낸다.

    if(cmd[i]  == 'R') isReverse = !isReverse;
    
    else {
    	if(dq.empty()) {
        		isDelete = true;
    		break;
    	}
    
    	if(isReverse) dq.pop_back();
    	else dq.pop_front();
    }

     

     

    코드 )

    #include <iostream>
    #include <deque>
    using namespace std;
    
    int T, n;
    string cmd, arr, tmp;
    deque<int> dq;
    bool isReverse=false, isDelete=false;
    
    int main(void)
    {
    	ios::sync_with_stdio(0);
    	cin.tie(0); cout.tie(0);
    
    	cin >> T;
    	while(T--) {
    		dq.clear();
    		cin >> cmd >> n >> arr;
    
    		// 앞 대괄호 [ 제외
    		arr = arr.substr(1, arr.size() - 1);
    		for(int i=0; i<arr.size(); i++) {
    			if( (arr[i] == ',' || arr[i] == ']') && tmp != "" ){
    				dq.push_back(atoi(tmp.c_str()));
    				tmp = "";
    			}
    			else 
    				tmp += arr[i];
    		}
    
    		for(int i=0; i<cmd.size(); i++) {
    			if(cmd[i]  == 'R') isReverse = !isReverse;
    			else {
    				if(dq.empty()) {
    					isDelete = true;
    					break;
    				}
    
    				if(isReverse) dq.pop_back();
    				else dq.pop_front();
    			}
    		}
    
    		if(isDelete) {
    			cout << "error\n";
    		}
    		else if(dq.empty()) cout << "[]\n";
    		else if(isReverse) {
    			cout << "[";
    			while(dq.size() > 1) {
    				cout << dq.back() << ",";
    				dq.pop_back();
    			}
    			cout << dq.back() << "]\n";
    		}
    		else {
    			cout << "[";
    			while(dq.size() > 1) {
    				cout << dq.front() << ",";
    				dq.pop_front();
    			}
    			cout << dq.front() << "]\n";
    		}
    	}
    }

    '백준코딩일기' 카테고리의 다른 글

    5397) 키로거 c++  (0) 2020.11.05
    1406) 에디터 c++  (0) 2020.11.05
    1021) 회전하는 큐 c++  (0) 2020.11.04
    10866) 덱 c++  (0) 2020.11.04
    2164) 카드2 c++  (0) 2020.11.04

    댓글

Designed by Tistory.