๊ดํธ ๋ณํ
๋ฌธ์
programmers.co.kr/learn/courses/30/lessons/60058
๋ฌธ์ ์ค๋ช
์นด์นด์ค์ ์ ์
๊ฐ๋ฐ์๋ก ์
์ฌํ ์ฝ์ ์ ๋ฐฐ ๊ฐ๋ฐ์๋ก๋ถํฐ ๊ฐ๋ฐ์ญ๋ ๊ฐํ๋ฅผ ์ํด ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ์์ค ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ ๋ฌธ์ ์ ์ ๋ฐ๊ฒฌํ๊ณ ์์ ํ๋ผ๋ ์
๋ฌด ๊ณผ์ ๋ฅผ ๋ฐ์์ต๋๋ค. ์์ค๋ฅผ ์ปดํ์ผํ์ฌ ๋ก๊ทธ๋ฅผ ๋ณด๋ ๋๋ถ๋ถ ์์ค ์ฝ๋ ๋ด ์์ฑ๋ ๊ดํธ๊ฐ ๊ฐ์๋ ๋ง์ง๋ง ์ง์ด ๋ง์ง ์์ ํํ๋ก ์์ฑ๋์ด ์ค๋ฅ๊ฐ ๋๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
์์ ํด์ผ ํ ์์ค ํ์ผ์ด ๋๋ฌด ๋ง์์ ๊ณ ๋ฏผํ๋ ์ฝ์ ์์ค ์ฝ๋์ ์์ฑ๋ ๋ชจ๋ ๊ดํธ๋ฅผ ๋ฝ์์ ์ฌ๋ฐ๋ฅธ ์์๋๋ก ๋ฐฐ์น๋ ๊ดํธ ๋ฌธ์์ด์ ์๋ ค์ฃผ๋ ํ๋ก๊ทธ๋จ์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋ฐํ๋ ค๊ณ ํฉ๋๋ค.
์ฉ์ด์ ์ ์
'(' ์ ')' ๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฌธ์์ด์ด ์์ ๊ฒฝ์ฐ, '(' ์ ๊ฐ์์ ')' ์ ๊ฐ์๊ฐ ๊ฐ๋ค๋ฉด ์ด๋ฅผ ๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ '('์ ')'์ ๊ดํธ์ ์ง๋ ๋ชจ๋ ๋ง์ ๊ฒฝ์ฐ์๋ ์ด๋ฅผ ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
์๋ฅผ ๋ค์ด, "(()))("
์ ๊ฐ์ ๋ฌธ์์ด์ ๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด ์ด์ง๋ง ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ ์๋๋๋ค.
๋ฐ๋ฉด์ "(())()"
์ ๊ฐ์ ๋ฌธ์์ด์ ๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด ์ด๋ฉด์ ๋์์ ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด ์
๋๋ค.
'(' ์ ')' ๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฌธ์์ด w๊ฐ ๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด ์ด๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ํตํด ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด๋ก ๋ณํํ ์ ์์ต๋๋ค.
1. ์
๋ ฅ์ด ๋น ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ, ๋น ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
2. ๋ฌธ์์ด w๋ฅผ ๋ "๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด" u, v๋ก ๋ถ๋ฆฌํฉ๋๋ค. ๋จ, u๋ "๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด"๋ก ๋ ์ด์ ๋ถ๋ฆฌํ ์ ์์ด์ผ ํ๋ฉฐ, v๋ ๋น ๋ฌธ์์ด์ด ๋ ์ ์์ต๋๋ค.
3. ๋ฌธ์์ด u๊ฐ "์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด" ์ด๋ผ๋ฉด ๋ฌธ์์ด v์ ๋ํด 1๋จ๊ณ๋ถํฐ ๋ค์ ์ํํฉ๋๋ค.
3-1. ์ํํ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ u์ ์ด์ด ๋ถ์ธ ํ ๋ฐํํฉ๋๋ค.
4. ๋ฌธ์์ด u๊ฐ "์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด"์ด ์๋๋ผ๋ฉด ์๋ ๊ณผ์ ์ ์ํํฉ๋๋ค.
4-1. ๋น ๋ฌธ์์ด์ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ก '('๋ฅผ ๋ถ์
๋๋ค.
4-2. ๋ฌธ์์ด v์ ๋ํด 1๋จ๊ณ๋ถํฐ ์ฌ๊ท์ ์ผ๋ก ์ํํ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ ์ด์ด ๋ถ์
๋๋ค.
4-3. ')'๋ฅผ ๋ค์ ๋ถ์
๋๋ค.
4-4. u์ ์ฒซ ๋ฒ์งธ์ ๋ง์ง๋ง ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๊ณ , ๋๋จธ์ง ๋ฌธ์์ด์ ๊ดํธ ๋ฐฉํฅ์ ๋ค์ง์ด์ ๋ค์ ๋ถ์
๋๋ค.
4-5. ์์ฑ๋ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด p๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ฃผ์ด์ง ์๊ณ ๋ฆฌ์ฆ์ ์ํํด ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด๋ก ๋ณํํ ๊ฒฐ๊ณผ๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
๋งค๊ฐ๋ณ์ ์ค๋ช
- p๋ '(' ์ ')' ๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฌธ์์ด์ด๋ฉฐ ๊ธธ์ด๋ 2 ์ด์ 1,000 ์ดํ์ธ ์ง์์ ๋๋ค.
- ๋ฌธ์์ด p๋ฅผ ์ด๋ฃจ๋ '(' ์ ')' ์ ๊ฐ์๋ ํญ์ ๊ฐ์ต๋๋ค.
- ๋ง์ฝ p๊ฐ ์ด๋ฏธ ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด๋ผ๋ฉด ๊ทธ๋๋ก return ํ๋ฉด ๋ฉ๋๋ค.
์ฝ๋
#include <string>
#include <vector>
using namespace std;
int findUV(string& str){
int left = 0; int right = 0;
for(int i=0; i<str.length(); i++){
if(str[i]=='(')
left++;
else
right++;
if(left==right){
// u์กฐ๊ฑด : ์ต์(์ฒ์์ผ)๋ก ์์ฑ๋๋ ๊ท ํ ๋ฌธ์์ด
return left+right;
}
}
return -1;
}
bool isRightStr(string& str){
int num=0;
for(int i=0; i<str.length(); i++){
if(str[i]=='(')
num++;
else
num--;
if(num<0){
return false;
}
}
if(num==0)
return true;
else
return false;
}
string moduleFunction(string str){
if(str=="")
return str;
string u, v;
int idx = findUV(str);
/*
if(idx==-1){
// ์๋ฌ, u๊ฐ ์์
}*/
if(idx!=str.length()){
u = str.substr(0,idx);
v = str.substr(idx,str.length());
}
else{
u= str.substr(0,str.length()); v=""; // ๋ณต์ฌํด์ ๋๊ฒจ์ผ ํจ
}
if(isRightStr(u)){
return u+moduleFunction(v);
}else{
string tmp = "(";
tmp+=moduleFunction(v);
tmp+=")";
for(int i=1; i<u.length()-1; i++){ // ์๋ค ๋ฌธ์ ์ ๊ฑฐ
if(u[i]=='(')
tmp+=")";
else
tmp+="(";
}
return tmp;
}
}
string solution(string p) {
string answer = "";
if(isRightStr(p))
return p;
answer = moduleFunction(p);
return answer;
}
์ฃผ์
- u์กฐ๊ฑด์ ์ ํด์ํด์ผํ๋ค. (์ต์์ ๊ท ํ์กํ ๋ฌธ์์ด)
u=str
์ฒ๋ผ ๋ฃ์ด๋ฒ๋ฆฌ๋ฉด ์ฃผ์๊ฐ ๋ณต์ฌ๋๋ฏ๋ก,u=str.substr(0)
๋ก ๋ณต์ฌ๋๊ฒ ํ๋ค.- ๋ฌธ์ ๋ง ์ ์ฝ๊ณ ๋๊ฐ์ด ๊ตฌํํ๋ฉด ๋๋ค.
๊ฒฐ๊ณผ
ํ์ด
๋ฌธ์ ๋ ๋๊ฐ์ด ํ์๊ณ , ์ถ๊ฐํ ๊ฒ์ด๋ผ๊ณ ๋ ์ต์ด์ "์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด"์ด๋ฉด ๋ฐ๋ก return ํ๊ฒ ํ๋ ๊ฒ์ด๋ค.
๋ค๋ฅธ ์ฌ๋์ ํ์ด
- substr ์ฌ์ฉ๋ฒ์ ์ ๊ธฐ์ตํ๊ณ ์์.
for(char ch : str)
๋ฌธ๋ฒ์ด ๊ฐ๋ฃํ๋ค.
Comment