본문 바로가기
백준 문제풀이

[백준] 5430 AC c++ 구현

by 꽁이꽁설꽁돌 2024. 2. 4.
728x90
반응형

 

목차

     

     

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

     

    5430번: AC

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

    www.acmicpc.net

    문제

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    문제 구현 방향

    c++의 이중연결리스트로 간단하게 구현 해 보았다.

     

     

    문제 풀이 시 주의점

    문자열을 입력받았을 때 숫자로 분리해내는게 조금은 까다로운 문제였다.

    또한 출력할 때 한 문자로 만들어 출력해야 틀리지 않는다는 것을 주의해야 한다.

     

     

     

    문제 풀이

    Rn카운트를 만들어 짝수와 홀수일 때로 나누면 된다.

    또한 사이즈가 0일때 D가 나올 경우, 완전히 비어있는 경우 [] 으로 나와야한다는 것만 주의하면 된다.

    반복을 하기 때문에 초기화만 잘 해주면 풀리는 문제이다.

     

     

    코드 구현

    #include<iostream>
    #include<list>
    #include<string>
    using namespace std;
    
    int main() {
    	ios::sync_with_stdio(0);  //C 표준 입출력의 동기화를 끄는 코드로 C++에서 입출력 속도를 높이기 위함.
    	cin.tie(0);
    	cout.tie(0);
    	list<long long int> List;
    	list<long long int>::iterator iter;
    	long long int testcase, i, num, j, Rn=0, currentNumber, errorcnt =0;
    	string func, arrays, separator = ",", answer;
    	cin >> testcase;
    	for (i = 0; i < testcase; i++) {
    		cin >> func;
    		cin >> num;
    		cin >> arrays;
    		currentNumber = 0;
    
    		// 문자열 순회하며 숫자만 <list>에 추가
    		for (char c : arrays) {
    			if (isdigit(c)) {
    				// 현재 읽고 있는 숫자를 갱신
    				currentNumber = currentNumber * 10 + static_cast<long long int>(c - '0');
    			}
    			else {
    				// 숫자가 아닌 경우, 현재까지 읽은 숫자를 리스트에 추가하고 초기화
    				if (currentNumber != 0) {
    					List.push_back(currentNumber);
    					currentNumber = 0;
    				}
    			}
    		}
    		for (j = 0; j < func.length(); j++) {
    			if (func.substr(j, 1) == "R") {       
    				Rn++;     //Rn카운트 증가
    			}
    			if (func.substr(j, 1) == "D") {  
    				if (List.size() == 0) {
    					cout << "error" << endl;
    					errorcnt = 1;
    					break;
    				}
    				if (Rn % 2 == 0) {    //Rn 카운트가 짝수이면 앞에서 삭제
    					List.pop_front();
    				}
    				else {    //Rn 카운트가 홀수이면 앞에서 삭제
    					List.pop_back();
    				}
    			}
    
    		}
    		answer = "";
    		if (List.size() != 0) {         //완전히 비어있지 않다면
    			if (Rn % 2 == 0) {
    				answer += "[";  //첫 문자 [ 추가
    				for (iter = List.begin(); iter != List.end(); ++iter) {
    					if (iter == prev(List.end())) {  //끝문자일때만 ]추가
    						answer += to_string(*iter);
    						answer += "]";
    					}
    					else {
    						answer += to_string(*iter);
    						answer += ",";
    					}
    
    				}
    			}
    			else {
    				answer += "["; //첫 문자 [ 추가
    				for (iter = prev(List.end()); iter != List.begin(); --iter) {
    					answer += to_string(*iter);
    					answer += ",";
    				}
    				answer += to_string(*iter);    //끝문자일때만 ]추가
    				answer += "]";
    			}
    
    		}
    		else {
    			if (errorcnt == 0) {   //비어있고 error카운트가 0이면
    				answer += "[";
    				answer += "]";
    			}
    				
    		}
    		if(errorcnt ==0)    //error카운트가 0이면 출력
    		    cout << answer << endl;
    		List.clear();   //초기화
    		Rn = 0;
    		errorcnt = 0;
    	}
    	
    }

     

    반응형