[백준] B5430 AC

mmnono·2025년 3월 4일
0

알고리즘

목록 보기
2/10

문제


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

풀이

정수 배열에 배열을 조작하는 함수는 reverse와 delete 뿐이다.
배열의 가장 첫번째 요소와 마지막 요소를 가리키는 포인터 front, back을 설정하여 구현하면 쉽게 해결된다.

  1. R 함수 수행 시 reverse 여부를 변경한다
  2. D 함수 수행 시 reverse 여부에 따라 front와 back을 기준으로 하여 첫 번째 요소를 제거한 후 list_size를 하나 감소시킨다.
    • 포인터로 수행하도록 되어 있으므로 front와 back이 가리키는 배열의 주소값을 증가시키거나 감소시키면 된다.
    • 만약 list_size가 0이라면 오류를 발생시킨다.
  3. 명령에 대해 1,2번 조건에 맞춰 수행한 후 reverse 여부에 따라 front나 back을 기준으로 출력을 진행하면 된다.
class AC {
private:
	int* list_arr;
	int* front;
	int* back;
	int list_size;
	bool reverse; //true면 뒤집힌 상태

public:
	AC() {
		//생성자
		list_arr = NULL;
		front = NULL;
		back = NULL;
		list_size = 0;
		reverse = false;
	}
	
	void input_nums() {
		//원소 입력 함수
		cin >> list_size;
		list_arr = new int[list_size]; //원소 배열 동적할당
		front= list_arr;
		back = list_arr + list_size -1;
		
		char ch;
		cin >> ch; // [ 입력 버리기 
		for (int i = 0;i < list_size;i++) {
			
			cin>>list_arr[i];
			//cout<<list_arr[i]<<endl;
			if(i!=list_size-1)
				cin >> ch; // , 입력 버리기
		}
		//cout << list_size << endl;
		cin >> ch; //] 입력 버리기
		
	};

	void R() {
		//리스트 뒤집기 함수
		//포인터 변경
		reverse=!reverse;
	}

	bool D() {
		//첫 원소 삭제 = pointer가 가리키는 원소 제거 후 포인터 이동
		if (list_size == 0) {
			cout << "error" << endl;
			return true;
		}
		//cout << "정상 삭제" << endl;
		//reverse가 true면 back을 이동
		if(reverse){
			back--;
		}
		else{
			front++;
		}
		list_size--;

		return false;
	}

	void print() {
		//리스트 출력 함수
		//reverse가 true면 뒤집어서 출력
		//cout << list_size << " : ";
		cout << "[";
		if (list_size == 0) {
			cout << "]" << endl;
			return;
		}

		//reverse가 true면 back-front 출력
		int* temp = reverse ? back : front;
		for (int i = 0; i < list_size; i++) {
			cout << *temp;
			if (i != list_size - 1) {
				cout << ",";
			}
			temp += reverse ? -1 : 1;
		}
		cout << "]" << endl;
	}

	~AC() {
		//소멸자
		delete[] list_arr;
	}
};

int main() {
	//test case 개수 입력
	int test_case;
	cin >> test_case;
	for (int i = 0;i < test_case;i++) {
		AC ac; //AC 객체 생성

		//명령어 입력
		string command;
		cin>>command;
		
		//원소 개수 입력
		ac.input_nums();

		//명령어 수행
		bool flag=false;
		for (int k = 0;k < command.size();k++) {
			if (command[k]=='R') 
				ac.R();
			else if(command[k]=='D') {
				if (ac.D()) {
					flag = true;
					break;
				}
			}
		}
		if(flag) //에러가 발생했다면 배열 요소를 출력 x
			continue;
		ac.print();
	}
	return 0;
}

0개의 댓글