알고리즘 모음(C++)

백준 5430 - AC(C++) 본문

백준

백준 5430 - AC(C++)

공대생의 잡다한 사전 2022. 2. 13. 22:27

문제 링크입니다. https://www.acmicpc.net/problem/5430

 

5430번: AC

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

www.acmicpc.net

Deque과 문자열을 이용해 풀 수 있는 문제였습니다

문제 조건
출력 예시

문제를 풀기 위해서는 구현해야할 것이 3가지가 있습니다.

1. 문자열이 주어졌을때, 숫자를 구하기

2. 함수 P 실행하기

3. 실행한 결과 출력하기

 

1. 문자열이 주어졌을때, 숫자구하기

	string num;
	for (int i = 0; i < number.size(); i++) {
		if (number[i] >= '0' && number[i] <= '9') {
			num += number[i];
		}
		else {
			if (num.size() > 0) {
				Number.push_back(stoi(num));
				num = '\n';
			}
		}
	}

주어진 문자열에서 '''과 '[' 을 제외한 나머지 문자를 찾은뒤 숫자로 만들어야합니다.

따라서 숫자일 경우, num 변수에 해당 숫자를 붙여줍니다.

숫자가 아닌 문자가 나왔으며, num 변수가 비어있지 않다면 -> deque에 해당 문자열을 정수로 바꾼뒤 넣어줍니다.

그리고 num 변수를 비어주는 것도 중요합니다.

 

 

2. 함수 P 실행하기

int solve() {
	int num_D = 0, num_R = 0;
	for (int i = 0; i < order.size(); i++) {
		if (order[i] == 'D') num_D++;
	}
	if (num_D > N) return -1;
	if (num_D == N) return 0;
	for (int i = 0; i < order.size(); i++) {
		if (order[i] == 'R') {
			if (num_R == 0) num_R = 1;
			else num_R = 0;
		}
		else {
			if (num_R == 0) {
				Number.pop_front();
			}
			else {
				Number.pop_back();
			}
		}
	}
	if (num_R == 0) return 1;
	else return 2;
}

결과를 출력하는 경우는 3가지입니다.

1. error를 출력하는 경우

2. 빈칸([])을 출력하는 경우

3. 빈칸과 숫자를 같이 출력하는 경우

 

1번과 2번 경우는 탐색을 하기 전에 확인할 수 있습니다.

먼저 함수 P에서 D 연산이 얼마나 있는지를 확인한 뒤, 숫자의 갯수와 비교합니다. 

D 연산의 갯수 >= 숫자의 갯수일 경우 각각 1번과 2번 경우를 출력해줍니다.

 

3번의 경우를 확인해보겠습니다.

뒤집고 난뒤 D 연산을 했을때 -> 뒤집기 전 마지막수를 없앤다.

2번 뒤집고 D 연산을 했을때 -> 뒤집지 않는 것과 같은 결과이다.

RDRD 연산 -> 뒤에서 하나 앞에서 하나를 지운다.

-> 배열을 뒤집을 필요가 없고, R 연산의 횟수를 새준뒤 횟수에 따라 앞 혹은 뒤에서 수를 빼주기만 하면 됩니다.

 

 

3. 출력하기

2번을 실행한 뒤, 결과 값에 따라서 출력해주면 됩니다.

주의할 점은 뒤집힌 상태 or 뒤집히지 않는 상태에 따라서 뒤 or 앞에서 부터 출력해주면 됩니다.

 

 

 

문제 접근 방법

1. 문자열에서 숫자 찾기

2. 함수 P를 실행하기3

3. 2번 결과에 따라서 답 출력하기

 

 

 

자세한 것은 코드를 참고해주세요

#define _CRT_SECURE_NO_WARNINGS
#include <cstring>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstdio>
#include <deque>
#include <stack>

using namespace std;

int N;
int test_case;
string number, order;
deque<int> Number;

void input() {
	string num;
	for (int i = 0; i < number.size(); i++) {
		if (number[i] >= '0' && number[i] <= '9') {
			num += number[i];
		}
		else {
			if (num.size() > 0) {
				Number.push_back(stoi(num));
				num = '\n';
			}
		}
	}
}

int solve() {
	int num_D = 0, num_R = 0;
	for (int i = 0; i < order.size(); i++) {
		if (order[i] == 'D') num_D++;
	}
	if (num_D > N) return -1;
	if (num_D == N) return 0;
	for (int i = 0; i < order.size(); i++) {
		if (order[i] == 'R') {
			if (num_R == 0) num_R = 1;
			else num_R = 0;
		}
		else {
			if (num_R == 0) {
				Number.pop_front();
			}
			else {
				Number.pop_back();
			}
		}
	}
	if (num_R == 0) return 1;
	else return 2;
}

void output(int x) {
	if (x == -1) cout << "error\n";
	else if (x == 0) cout << "[]\n";
	else if (x == 1){
		cout << "[";
		while (1) {
			cout << Number.front();
			Number.pop_front();
			if (Number.empty()) break;
			cout << ",";
		}
		cout << "]\n";
	}
	else {
		cout << "[";
		while (1) {
			cout << Number.back();
			Number.pop_back();
			if (Number.empty()) break;
			cout << ",";
		}
		cout << "]\n";
	}
	while (!Number.empty()) Number.pop_back();
}

int main()
{
	cin.tie(0);
	cout.tie(0);
	cin >> test_case;;
	for (int i = 1; i <= test_case; i++) {
		cin >> order >> N >> number;
		input();
		int ans = solve();
		output(ans);
	}
	return 0;
}

 

 

질문 및 조언 댓글 남겨주세요

'백준' 카테고리의 다른 글

백준 1074 - Z(C++)  (0) 2022.02.14
백준 7662 - 이중 우선순위 큐(C++)  (0) 2022.02.14
백준 6064 - 카잉 달력(C++)  (0) 2022.02.13
백준 1541 - 잃어버린 괄호(C++)  (0) 2022.02.11
백준 9375 - 패션왕 신해빈(C++)  (0) 2022.02.11