Aracade Intro #13 ReverseParentheses, Codefights, CodeSignal, 코드파이트, 알고리즘, algorithm
이거 진짜 재귀로 풀기 젼나 빡쎘슴..
It was hella hard to solve using recursive..
Q.
입력받는 s 스트링이 있는데, 영어글자, 괄호, 스페이스 이런걸로 채워져있는데 가장 안쪽의 괄호에서부터 뒤집어서 중복되면 또 뒤집고, 뒤집고 암튼 괄호 싹 없애서 마지막 문자를 출력해봐라.
e.g.
1.
Input ---- s: "The ((quick (brown) (fox) jumps over the lazy) dog)"
Output ----- "The god quick nworb xof jumps over the lazy"
2.
Input ---- s: "co(de(fight)s)"
Output ----- "cosfighted"
Process
//1. Input string
//2. Iterate from begin to the end
// 2.1. If it's not a parentheses -> Add to returnString
// 2.2. If it's parentheses
// 2.2.1. Bind all till close parentheses, remain i
// 2.2.2. Reverse that
// 2.2.3. Call recursive function with reversed word
// 2.2.4. Save the result of recursive function
//3. Finish?
처리과정
//1. string을 입력받는다.
//2. 시작부터 끝까지 반복한다.
// 2.1. 괄호가 아니면 글자를 출력글자에 저장한다.
// 2.2. 괄호이면
// 2.2.1. 그 해당괄호의 닫는 괄호까지 글자들을 묶는다. 묶으면서 i 넘겨놓는다.
// 2.2.2. 묶은 글자들을 뒤집는다.
// 2.2.3. 뒤집은걸 넣어서 재귀함수를 호출한다.
// 2.2.4. 재귀함수 결과물을 출력글자에 저장한다.
//3. 끝낸다?
code
코드.. 코드를 보자!
It's been a long time ago solving this.. so i just adjust some.. and post it
푼지 오래돼서 기억 안나고 걍 대충 코드 정리만 해서 올림
std::string reverseInParentheses(std::string s) {
std::string answer;
int length = s.size();
for (int i = 0; i < length; ++i)
{
if (s.at(i) != '(' && s.at(i) != ')')
{
answer.push_back(s.at(i));
}
else // 괄호이면 if it's parentheses
{
int pCount = 1;
bool isDone = false;
int j = i + 1;
std::string tempString;
while (isDone == false) // 해당괄호까지 묶는다 bind till parentheses
{
if (s.at(j) == '(' || s.at(j) == ')')
{
if (s.at(i) == s.at(j))
{
++pCount;
tempString.push_back(s.at(j));
}
else
{
if (pCount == 1)
{
isDone = true;
}
else
{
pCount--;
tempString.push_back(s.at(j));
}
}
}
else {
tempString.push_back(s.at(j));
}
++j;
}
i = j - 1; // i 넘겨준다
std::string reverseTempString;
int tempLength = tempString.size();
for (int j = 0; j < tempLength; ++j) // 뒤집는다 Reverse
{
reverseTempString.push_back(tempString.back());
tempString.pop_back();
}
// 재귀함수 recursive function
std::string returnString = reverseInParentheses(reverseTempString);
int returnLength = returnString.size();
for (int j = 0; j < returnLength; ++j) // 재귀결과물 출력문자에 저장 Save recursive return
{
answer.push_back(returnString.at(j));
}
}
}
return answer;
}
Something else..
'Algorithm > Code Fights (Code Signal)' 카테고리의 다른 글
Aracade Intro #15 AddBorder, Codefights, CodeSignal, 코드파이트, 코드시그널, c++ java c# scalar (0) | 2018.10.21 |
---|---|
Aracade Intro #14 AlternatingSums, Codefights, CodeSignal (0) | 2018.10.20 |
Aracade Intro #12 SortByHeight (0) | 2018.10.08 |
Aracade Intro #11 IsLucky (0) | 2018.10.06 |
Aracade Intro #10 CommonCharacterCount (0) | 2018.10.03 |