문자열 타입 변수 str에 소스 코드가 저장되어 있다고 가정해 봅시다. 먼저 문자열의 크기를 계산한 뒤 함수에 전달하고, 주어진 소스 코드를 알맞게 재정렬하여 결과를 출력하는 것이 이번 문제의 목표입니다.
입출력 시나리오 살펴보기
입력 − string str =
"#include <bits/stdc++.h>
using namespace std;
int main()"
"{ int sum, first, second; sum = first + second; printf(\"%d\", c);"
" return 0;}"출력 −
#include <bits/stdc++.h>
using namespace std;
int main(){
int sum, first, second;
sum = first + second;
printf("%d", c);
return 0;
}입력 − string str =
"#include<bits/stdc++.h>
using namespace std;
int main()"
"{ printf(\"%d\", c);"
" return 0;}"출력 −
#include<bits/stdc++.h>
using namespace std;
int main(){
printf("%d", c);
return 0;
}프로그램에 사용된 접근 방식
문자열 타입 변수 str을 입력받고, 문자열의 크기를 계산하여 length라는 이름의 변수에 저장합니다.
데이터를 Rearrangement(str, length) 함수에 전달합니다.
Rearrangement(arr, length) 함수 내부에서 다음 작업을 수행합니다.
문자열 타입 변수 str_1과 정수형 변수 Parenthesis = 0, Braces = 0, count = 0, i = 0, j = 0을 선언합니다.
do-WHILE 루프를 시작합니다. 루프 안에서 str[i]가 '#', '<', '>', ';', '}', '{', '(', ')' 중 하나인지 확인하고, 만약 str[i]가 '{'라면 Braces 값을 1 증가시킵니다.
str[i]가 '}'라면 Braces 값을 1 감소시킵니다.
str[i]가 '<'이고 Parenthesis가 0이라면 count를 1 증가시킵니다.
str[i]가 '>'이고 Parenthesis가 0이라면 count를 1 감소시킵니다.
str[i]가 '('라면 count를 0으로 설정하고 Parenthesis를 1 증가시킵니다.
str[i]가 ')'라면 Parenthesis를 1 감소시킵니다.
Parenthesis가 0보다 크면 str_1에 str[i]를 추가합니다. 그렇지 않은 경우, str[i]가 ')'라면 str_1에 str[i]를 추가합니다.
그 외에 str[i]가 '{' 또는 '}'라면 str_1에 '\n', str[i], '\n'을 순서대로 추가합니다.
count가 0보다 크다면 str_1에 str[i]를 추가합니다.
str[i]가 '#'이라면 str_1에 '\n'과 str[i]를 추가합니다.
위 조건에 모두 해당하지 않으면 str_1에 str[i]와 '\n'을 추가합니다.
특수 문자가 아닌 일반 문자라면 str_1에 str[i]를 추가하고 i를 1 증가시킵니다.
str_1 마지막에 '\0'을 추가합니다.
i부터 str_1 문자열 길이 미만까지 FOR 루프를 실행하며, 루프 내부에서 str_1[i]를 출력합니다.
결과를 출력합니다.
예제
#include <bits/stdc++.h>
using namespace std;
void Rearrangement(string str, int length){
string str_1;
int Parenthesis = 0;
int Braces = 0;
int count = 0;
int i = 0;
int j = 0;
do{
if(str[i] == '#' || str[i] == '<' || str[i] == '>' || str[i] == ';' || str[i] == '}' || str[i] == '{' || str[i] == '(' || str[i] == ')'){
if(str[i] == '{'){
Braces++;
}
if(str[i] == '}'){
Braces--;
}
if(str[i] == '<' && Parenthesis == 0){
count++;
}
if(str[i] == '>' && Parenthesis == 0){
count--;
}
if(str[i] == '('){
count = 0;
Parenthesis++;
}
if(str[i] == ')'){
Parenthesis--;
}
if(Parenthesis > 0){
str_1 = str_1 + str[i];
}
else{
if(str[i] == ')'){
str_1 = str_1 + str[i];
}
else if(str[i] == '{' || str[i] == '}'){
str_1 = str_1 + '\n';
str_1 = str_1 + str[i];
str_1 = str_1 + '\n';
}
else if(count > 0){
str_1 = str_1 + str[i];
}
else if(str[i] == '#'){
str_1 = str_1 + '\n';
str_1 = str_1 + str[i];
}
else{
str_1 = str_1 + str[i];
str_1 = str_1 + '\n';
}
}
}
else{
str_1 = str_1 + str[i];
}
i++;
}while (i < length);
str_1 = str_1 + '\0';
for(i = 0; i < str_1.length(); i++){
cout<< str_1[i];
}
}
int main(){
string str = "#include <bits/stdc++.h>using namespace std;int main()"
"{ int sum, first, second; sum = first + second; printf(\"%d\", c);"
" return 0;}";
int length = str.length();
Rearrangement(str, length);
return 0;
}출력 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
#include <bits/stdc++.h>
using namespace std;
int main()
{
int sum, first, second;
sum = first + second;
printf("%d", c);
return 0;
}