알고리즘 모음(C++)
백준 5430 - AC(C++) 본문
문제 링크입니다. https://www.acmicpc.net/problem/5430
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 |