[백준 / C++] 5430번: AC

728x90
728x90

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

 

5430번: AC

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

www.acmicpc.net

난이도: solved.ac 골드 5

 

일단 수를 배열에 저장시키고, front와 rear라는 커서를 둬서 R이면 front와 rear의 위치를 서로 바꾸고 D면 front를 한 칸 이동시키는 식으로 풀었다

 

그리고 front와 rear 사이에 수가 없는데 D를 하면 error를 출력하도록 해주었다

 

수를 배열에 담을 때는 '['와 ']'를 따로 입력받고, 수는 콤마(,)로 구분해서 입력받았다

 

#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>

int arr[100001];
char p[100001];

int main() {
	int i, T, n;
	scanf("%d", &T);
	while (T--) {
		scanf("%s", p);
		scanf("%d", &n);

		char garb;
		scanf(" %c", &garb);	// '['를 입력 받는 용도
		for (i = 0; i < n; i++)
			scanf("%d,", &arr[i]);	// ','로 구분
		scanf(" %c", &garb);	// ']'를 입력 받는 용도

		// 배열에 들어있는 수는 front와 rear 사이에 있는 수임
		int front = -1, rear = n;
		int len_p = strlen(p), cur = 0;
		for (cur = 0; cur < len_p; cur++) {
			if (p[cur] == 'R') {
				// front와 rear 위치 서로 바꾸기
				int temp = front;
				front = rear;
				rear = temp;
			}
			else if(p[cur] == 'D') {
				if (front == rear - 1 || rear == front - 1) {
					// front와 rear 사이의 수가 없으면 break
					break;
				}
				else if (front < rear)
					front++;
				else
					front--;
			}
		}
		// cur < len_p인 경우: 배열이 비어있는데 D한 경우
		if (cur < len_p) {
			// error 출력하고 다음 테스트 케이스로
			printf("error\n");
			continue;
		}

		printf("[");
		if (front < rear) {
			if (front == rear - 1) {
				// 사이의 수가 없을 때
				printf("]\n");
				continue;
			}
			while (front < rear - 2) {
				// 마지막 원소는 뒤에 ','를 붙이지 않으므로 따로 처리
				printf("%d,", arr[front + 1]);
				front++;
			}
			// 마지막 원소
			printf("%d]\n", arr[front + 1]);
		}
		else {
			if (rear == front - 1) {
				// 사이의 수가 없을 때
				printf("]\n");
				continue;
			}
			while (rear < front - 2) {
				// 마지막 원소는 뒤에 ','를 붙이지 않으므로 따로 처리
				printf("%d,", arr[front - 1]);
				front--;
			}
			// 마지막 원소
			printf("%d]\n", arr[front - 1]);
		}
	}
}

 

코드 제출 결과
코드 제출 결과

반응형