[伯俊5430]交流
32033 ワード
https://www.acmicpc.net/problem/5430
▼▼初めて近づく
各テストケースは、実行する関数、配列内の個数、配列内の個数を入力します.筆者は配列中の数字を文字列形式で入力し,この文字列は無条件に最初が[],最後が[],erase関数で消去した.そして、「,」を基準として切り出されたタグが格納される.タイムアウトを避けるためではなく、「R」が偶数か奇数かを判断し、逆関数を使ったように動作させる.D'を作成したがトークンが保存されていない場合は「error」を出力します.
実行後,結果は誤りであり,考えられるすべての反例をテストしたにもかかわらず,誤りを続けた.
そこで最初からよく見てみると、配列中の数字ArrStrが「[]」だと思うと、その配列の前後の括弧を外すとsizeは0、chartemp[arrStr.size()];このchar temp[0];これは間違いを意味するからです.
したがって,配列内の数字を受信すると,[]と[]の2つのケースに分けて解決する.
▼▼初めて近づく
各テストケースは、実行する関数、配列内の個数、配列内の個数を入力します.筆者は配列中の数字を文字列形式で入力し,この文字列は無条件に最初が[],最後が[],erase関数で消去した.そして、「,」を基準として切り出されたタグが格納される.タイムアウトを避けるためではなく、「R」が偶数か奇数かを判断し、逆関数を使ったように動作させる.D'を作成したがトークンが保存されていない場合は「error」を出力します.
実行後,結果は誤りであり,考えられるすべての反例をテストしたにもかかわらず,誤りを続けた.
そこで最初からよく見てみると、配列中の数字ArrStrが「[]」だと思うと、その配列の前後の括弧を外すとsizeは0、chartemp[arrStr.size()];このchar temp[0];これは間違いを意味するからです.
#include <bits/stdc++.h>
using namespace std;
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
int T = 0;
cin >> T;
while(T--) {
// 수행할 함수, 배열에 들어있는 수의 개수, 배열에 들어있는 수를 입력받는다.
string str = "";
cin >> str;
int n = 0;
cin >> n;
string arrStr = "";
cin >> arrStr;
// 배열 앞, 뒤의 괄호 제거
arrStr.erase(arrStr.begin());
arrStr.erase(arrStr.end()-1);
// strtok는 string으로 선언된 변수를 사용할 수 없으므로 char 배열에 복사한다.
char temp[arrStr.size()];
fill(temp,temp+arrStr.size(),0);
for(int i = 0; i < arrStr.size(); i++) {
temp[i] = arrStr[i];
}
// temp 배열에 있는 문자열을 콤마 단위로 잘라서 저장
char* ptr = strtok(temp,",");
deque<int> D;
while(ptr != NULL) {
D.push_back(atoi(ptr));
ptr = strtok(NULL,",");
}
// 수행할 함수가 들어있는 문자열에서 각각의 문자에 대해 처리
int flag = 0; // error인지 판별하기 위한 변수
int rev = 0; // reverse함수를 쓰지 않기 위해
for(int i = 0; i < str.length(); i++) {
switch(str[i]) {
case 'R':
++rev;
break;
case 'D':
if(D.empty()) {
cout << "error" << '\n';
flag = 1;
}
else {
if(rev % 2 == 0) {
D.pop_front();
}
else {
D.pop_back();
}
}
break;
}
if(flag)
break;
}
// error가 아닐 경우에 출력
if((!flag)) {
cout << "[";
if(rev % 2 == 0) {
for(int i = 0; i < D.size(); i++) {
cout << D[i];
if(i != D.size()-1)
cout << ",";
}
}
else {
for(int i = D.size() - 1; i >= 0; i--) {
cout << D[i];
if(i != 0)
cout << ",";
}
}
cout << "]" << '\n';
}
}
return 0;
}
▼2度目の接近したがって,配列内の数字を受信すると,[]と[]の2つのケースに分けて解決する.
#include <bits/stdc++.h>
using namespace std;
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
int T = 0;
cin >> T;
while(T--) {
// 수행할 함수, 배열에 들어있는 수의 개수, 배열에 들어있는 수를 입력받는다.
string str = "";
cin >> str;
int n = 0;
cin >> n;
string arrStr = "";
cin >> arrStr;
// 배열 앞, 뒤의 괄호 제거
arrStr.erase(arrStr.begin());
arrStr.erase(arrStr.end()-1);
deque<int> D;
// strtok는 string으로 선언된 변수를 사용할 수 없으므로 char 배열에 복사한다.
if(arrStr.size() != 0) { // arrStr의 size가 0일 경우에 temp 배열의 size가 0으로 선언한다는 의미이므로 arrStr의 size가 0일 때와 아닐 때를 구분
char temp[arrStr.size()];
fill(temp,temp+arrStr.size(),0);
for(int i = 0; i < arrStr.size(); i++) {
temp[i] = arrStr[i];
}
// temp 배열에 있는 문자열을 콤마 단위로 잘라서 저장
char* ptr = strtok(temp,",");
while(ptr != NULL) {
D.push_back(atoi(ptr));
ptr = strtok(NULL,",");
}
}
// 수행할 함수가 들어있는 문자열에서 각각의 문자에 대해 처리
int flag = 0; // error인지 판별하기 위한 변수
int rev = 0; // reverse함수를 쓰지 않기 위해
for(int i = 0; i < str.length(); i++) {
switch(str[i]) {
case 'R':
++rev;
break;
case 'D':
if(D.empty()) {
cout << "error" << '\n';
flag = 1;
}
else {
if(rev % 2 == 0) {
D.pop_front();
}
else {
D.pop_back();
}
}
break;
}
if(flag)
break;
}
// error가 아닐 경우에 출력
if((!flag)) {
cout << "[";
if(rev % 2 == 0) {
for(int i = 0; i < D.size(); i++) {
cout << D[i];
if(i != D.size()-1)
cout << ",";
}
}
else {
for(int i = D.size() - 1; i >= 0; i--) {
cout << D[i];
if(i != 0)
cout << ",";
}
}
cout << "]" << '\n';
}
}
return 0;
}
Reference
この問題について([伯俊5430]交流), 我々は、より多くの情報をここで見つけました https://velog.io/@eunsung-dev/백준-5430-ACテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol