- Union-Find
- ํ๋ฆฌ์จ๋ณด๋ฉ
- ์ฌ๊ท
- ๋์ ํ๋ก๊ทธ๋๋ฐ
- Python
- ์นด์นด์ค2021
- js
- ์ํฐ๋
- golang
- ์น๋ฆฐ์ด
- DFS
- ๋ฐฑ์๋ ํ๋ฆฌ์จ๋ณด๋ฉ
- ๋นํธ๋งต
- DP
- ํธ๋ฆฌ
- ์์ฝ๋
- ๊ฐ์ฅ๊ฐ๊น์ด๊ณตํต์กฐ์
- ๋ค์ต์คํธ๋ผ
- C++
- ์ด๋ถํ์
- ๋ฐฑ์ค
- go
- BFS
- ์นด์นด์ค ์ฝํ
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋นํธ๋ง์คํน
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
- LCs
- ์๊ณ ๋ฆฌ์ฆ
- nestjs
- Today
- Total
Hello Ocean! ๐ผ
[ํ๋ก๊ทธ๋๋จธ์ค] 2020 ์นด์นด์ค/๊ดํธ ๋ณํ ๋ณธ๋ฌธ
๋ฌธ์ ์ค๋ช
์นด์นด์ค์ ์ ์
๊ฐ๋ฐ์๋ก ์
์ฌํ์ฝ์ ์ ๋ฐฐ ๊ฐ๋ฐ์๋ก๋ถํฐ ๊ฐ๋ฐ์ญ๋ ๊ฐํ๋ฅผ ์ํด ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ์์ค ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ ๋ฌธ์ ์ ์ ๋ฐ๊ฒฌํ๊ณ ์์ ํ๋ผ๋ ์
๋ฌด ๊ณผ์ ๋ฅผ ๋ฐ์์ต๋๋ค. ์์ค๋ฅผ ์ปดํ์ผํ์ฌ ๋ก๊ทธ๋ฅผ ๋ณด๋ ๋๋ถ๋ถ ์์ค ์ฝ๋ ๋ด ์์ฑ๋ ๊ดํธ๊ฐ ๊ฐ์๋ ๋ง์ง๋ง ์ง์ด ๋ง์ง ์์ ํํ๋ก ์์ฑ๋์ด ์ค๋ฅ๊ฐ ๋๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
์์ ํด์ผ ํ ์์ค ํ์ผ์ด ๋๋ฌด ๋ง์์ ๊ณ ๋ฏผํ๋์ฝ์ ์์ค ์ฝ๋์ ์์ฑ๋ ๋ชจ๋ ๊ดํธ๋ฅผ ๋ฝ์์ ์ฌ๋ฐ๋ฅธ ์์๋๋ก ๋ฐฐ์น๋ ๊ดํธ ๋ฌธ์์ด์ ์๋ ค์ฃผ๋ ํ๋ก๊ทธ๋จ์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋ฐํ๋ ค๊ณ ํฉ๋๋ค.
์ฉ์ด์ ์ ์
'('์')'๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฌธ์์ด์ด ์์ ๊ฒฝ์ฐ, '(' ์ ๊ฐ์์ ')' ์ ๊ฐ์๊ฐ ๊ฐ๋ค๋ฉด ์ด๋ฅผ๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ '('์ ')'์ ๊ดํธ์ ์ง๋ ๋ชจ๋ ๋ง์ ๊ฒฝ์ฐ์๋ ์ด๋ฅผ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
์๋ฅผ ๋ค์ด,"(()))("์ ๊ฐ์ ๋ฌธ์์ด์๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด์ด์ง๋ง์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ ์๋๋๋ค.
๋ฐ๋ฉด์"(())()"์ ๊ฐ์ ๋ฌธ์์ด์๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด์ด๋ฉด์ ๋์์์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์
๋๋ค.
'(' ์ ')' ๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฌธ์์ด 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 ํ๋ฉด ๋ฉ๋๋ค.
์ ์ถ๋ ฅ ์
p | result |
"(()())()" | "(()())()" |
")(" | "()" |
"()))((()" | "()(())()" |
์ ์ถ๋ ฅ ์์ ๋ํ ์ค๋ช
์
์ถ๋ ฅ ์ #1
์ด๋ฏธ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์
๋๋ค.
์ ์ถ๋ ฅ ์ #2
- ๋ ๋ฌธ์์ด u, v๋ก ๋ถ๋ฆฌํฉ๋๋ค.
- u =")("
- v =""
- u๊ฐ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด ์๋๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์๋ก์ด ๋ฌธ์์ด์ ๋ง๋ญ๋๋ค.
- v์ ๋ํด 1๋จ๊ณ๋ถํฐ ์ฌ๊ท์ ์ผ๋ก ์ํํ๋ฉด ๋น ๋ฌธ์์ด์ด ๋ฐํ๋ฉ๋๋ค.
- u์ ์๋ค ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๊ณ , ๋๋จธ์ง ๋ฌธ์์ ๊ดํธ ๋ฐฉํฅ์ ๋ค์ง์ผ๋ฉด""์ด ๋ฉ๋๋ค.
- ๋ฐ๋ผ์ ์์ฑ๋๋ ๋ฌธ์์ด์"("+""+")"+""์ด๋ฉฐ, ์ต์ข ์ ์ผ๋ก"()"๋ก ๋ณํ๋ฉ๋๋ค.
์ ์ถ๋ ฅ ์ #3
- ๋ ๋ฌธ์์ด u, v๋ก ๋ถ๋ฆฌํฉ๋๋ค.
- u ="()"
- v ="))((()"
- ๋ฌธ์์ด u๊ฐ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด๋ฏ๋ก ๊ทธ๋๋ก ๋๊ณ , v์ ๋ํด ์ฌ๊ท์ ์ผ๋ก ์ํํฉ๋๋ค.
- ๋ค์ ๋ ๋ฌธ์์ด u, v๋ก ๋ถ๋ฆฌํฉ๋๋ค.
- u ="))(("
- v ="()"
- u๊ฐ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด ์๋๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์๋ก์ด ๋ฌธ์์ด์ ๋ง๋ญ๋๋ค.
- v์ ๋ํด 1๋จ๊ณ๋ถํฐ ์ฌ๊ท์ ์ผ๋ก ์ํํ๋ฉด"()"์ด ๋ฐํ๋ฉ๋๋ค.
- u์ ์๋ค ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๊ณ , ๋๋จธ์ง ๋ฌธ์์ ๊ดํธ ๋ฐฉํฅ์ ๋ค์ง์ผ๋ฉด"()"์ด ๋ฉ๋๋ค.
- ๋ฐ๋ผ์ ์์ฑ๋๋ ๋ฌธ์์ด์"("+"()"+")"+"()"์ด๋ฉฐ, ์ต์ข ์ ์ผ๋ก"(())()"๋ฅผ ๋ฐํํฉ๋๋ค.
- ์ฒ์์ ๊ทธ๋๋ก ๋ ๋ฌธ์์ด์ ๋ฐํ๋ ๋ฌธ์์ด์ ์ด์ด ๋ถ์ด๋ฉด"()"+"(())()"="()(())()"๊ฐ ๋ฉ๋๋ค.
๋ฌธ์ ์ค๋ช ์ด ๋ชน์ ๊ธธ๋ค. ๋ฐ๋ผ์ ๋ด๊ฐ ์ดํดํ๋๋ก ์์ฝํด๋ณด์๋ค.
1. p๋ฅผ u,v๋ก ์๋ฅธ๋ค
2-1. u๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด์ด๋ฉด
1) v์ ๋ํด 1๋ฒ ๋ถํฐ ์ํํด์ u๋ค์ ์ด์ด๋ถ์ธ ๋ค return
2-2, u๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด์ด ์๋๋ฉด
1) ๋น ๋ฌธ์์ด์ '(' ๋ถ์ด๊ธฐ
2) v์ ๋ํด 1๋ฒ๋ถํฐ ์ฌ๊ท์ ์ผ๋ก ์ํํ ๊ฒฐ๊ณผ ๋ถ์ด๊ธฐ
3) ')' ๋ถ์ด๊ธฐ
4) u์ ๋งจ ์ฒ์๊ณผ ๋งจ ๋ง์ง๋ง ๋ฌธ์ ์ ๊ฑฐ
5) u์ ๋๋จธ์ง ๋ฌธ์๋ค์ ๊ดํธ ๋ฐฉํฅ์ ๋ฐ๋๋ก ํด์ ๋ฌธ์์ด์ ๋ถ์ด๊ธฐ
6) ์์ฑ๋ ๋ฌธ์์ด return
ํ์ด
solution ํจ์๋ฅผ ์ฝ๋ฉํ๊ธฐ ์ ์, ๋ฌธ์ ํ์ด ๊ณผ์ ์์ ํ์ํ ๊ฒ ๊ฐ์ ํจ์๋ฅผ ๋จผ์ ๋ง๋ค์๋ค.
- int my_split(string p)
-
๋ฌธ์์ด p๋ฅผ u์ v๋ก ๋๋๊ธฐ ์ํ ํจ์์ด๋ค.
-
u์ ๋ง์ง๋ง ์์น์ index๋ฅผ ๋ฐํํ๋ค.
-
์์์๋ถํฐ ๊ฒ์ฌํ๋ค๊ฐ
๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด
์ด ์์ฑ๋๋ฉด ํด๋น ์๋ฆฌ์ index๋ฅผ ๋ฐํํ๋ค. -
solutionํจ์๋ ์์ index๊ฐ์ ๋ฐ์ substr()์ ์ด์ฉํด ๋ฌธ์์ด์ u์ v๋ก ์ชผ๊ฐ ๋ค.
int my_split(string p) { //u์ ๋ง์ง๋ง ์์น index ๋ฐํ int right = 0, left = 0; if (p[0] == '(') left++; else right++; int i = 1; int index; while (right != left) { if (p[i] == '(') left++; else right++; i++; } index = i - 1; return index; }
- bool is_proper(string p)
-
๋ฌธ์์ด p๊ฐ
์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด
์ธ์ง ๊ฒ์ฌํ๊ธฐ ์ํ ํจ์์ด๋ค. -
์ฌ๋ฐ๋ฅด๋ฉด 1, ์ฌ๋ฐ๋ฅด์ง ์์ผ๋ฉด 0์ ๋ฐํํ๋ค.
-
stack์ ์ด์ฉํ๋ค.
bool is_proper(string p) { //ํด๋น ๋ฌธ์์ด์ด ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด์ธ์ง ํ๋จ stack<char> s; if (p[0] == ')') //์์๋ถํฐ ')'์ด๋ฉด ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด์ด ๋ ์ ์์ return false; s.push(p[0]); for (int i = 1;i < p.size();i++) { if (s.empty()) return 0; //์ ๋ถ ๋๊ธฐ ์ ์ ์ด๋ฏธ ์คํ์ด ๋น์ด๋ฒ๋ฆฌ๋ฉด ์ฌ๋ฐ๋ฅด์ง ์์. if (s.top() == p[i]) s.push(p[i]); else s.pop(); } return s.empty(); //s๊ฐ ๋น์ด์์ผ๋ฉด ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด(true) }
solutionํจ์๋ ์์ ์์ฝํ ๊ณผ์ ์ ๊ทธ๋๋ก ์ฌ๊ทํจ์๋ก ๊ตฌํํ์๋ค.
1. p๋ฅผ u,v๋ก ์๋ฅธ๋ค
2-1. u๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด์ด๋ฉด
1) v์ ๋ํด 1๋ฒ ๋ถํฐ ์ํํด์ u๋ค์ ์ด์ด๋ถ์ธ ๋ค return
2-2, u๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด์ด ์๋๋ฉด
1) ๋น ๋ฌธ์์ด์ '(' ๋ถ์ด๊ธฐ
2) v์ ๋ํด 1๋ฒ๋ถํฐ ์ฌ๊ท์ ์ผ๋ก ์ํํ ๊ฒฐ๊ณผ ๋ถ์ด๊ธฐ
3) ')' ๋ถ์ด๊ธฐ
4) u์ ๋งจ ์ฒ์๊ณผ ๋งจ ๋ง์ง๋ง ๋ฌธ์ ์ ๊ฑฐ
5) u์ ๋๋จธ์ง ๋ฌธ์๋ค์ ๊ดํธ ๋ฐฉํฅ์ ๋ฐ๋๋ก ํด์ ๋ฌธ์์ด์ ๋ถ์ด๊ธฐ
6) ์์ฑ๋ ๋ฌธ์์ด return
string solution(string p) { //์ฌ๊ท
string answer = "";
if (p.size() == 0)
return "";
string u, v;
//1. p๋ฅผ u,v๋ก ์๋ฅด๊ธฐ
int index = my_split(p);
u = p.substr(0, index+1);
v = p.substr(index + 1);
//2. u๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด์ธ์ง ๊ฒ์ฌ
if (is_proper(u)) { //2-1. u๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด์ด๋ฉด
answer.append(u);
string result = solution(v);
answer.append(result);
}
else { //2-2. u๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด์ด ์๋๋ฉด
answer.append("("); // 1)
string result = solution(v); // 2)
answer.append(result);
answer.append(")"); // 3)
u = u.substr(1, u.size() - 2); // 4) u์ ๋งจ ์ฒ์, ๋งจ ๋ง์ง๋ง ๋ฌธ์ ์ ๊ฑฐ
// 5) u์ ๋๋จธ์ง ๋ฌธ์๋ค ๊ดํธ ๋ค์ง์ด์ ๋ถ์ด๊ธฐ
for (int i = 0;i < u.size();i++) {
if (u[i] == '(')
answer.append(")");
else
answer.append("(");
}
}
return answer;
}
์ต์ข ์ฝ๋
#include <string>
#include <vector>
#include <iostream>
#include <stack>
using namespace std;
int my_split(string p) { //u์ ๋ง์ง๋ง ์์น index ๋ฐํ
int right = 0, left = 0;
if (p[0] == '(')
left++;
else
right++;
int i = 1;
int index;
while (right != left) {
if (p[i] == '(')
left++;
else
right++;
i++;
}
index = i - 1;
return index;
}
bool is_proper(string p) { //ํด๋น ๋ฌธ์์ด์ด ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด์ธ์ง ํ๋จ
stack<char> s;
if (p[0] == ')') //์์๋ถํฐ ')'์ด๋ฉด ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด์ด ๋ ์ ์์
return false;
s.push(p[0]);
for (int i = 1;i < p.size();i++) {
if (s.empty())
return 0; //์ ๋ถ ๋๊ธฐ ์ ์ ์ด๋ฏธ ์คํ์ด ๋น์ด๋ฒ๋ฆฌ๋ฉด ์ฌ๋ฐ๋ฅด์ง ์์.
if (s.top() == p[i])
s.push(p[i]);
else
s.pop();
}
return s.empty(); //s๊ฐ ๋น์ด์์ผ๋ฉด ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด(true)
}
string solution(string p) { //์ฌ๊ท
string answer = "";
if (p.size() == 0)
return "";
string u, v;
//1. p๋ฅผ u,v๋ก ์๋ฅด๊ธฐ
int index = my_split(p);
u = p.substr(0, index+1);
v = p.substr(index + 1);
//2. u๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด์ธ์ง ๊ฒ์ฌ
if (is_proper(u)) { //2-1. u๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด์ด๋ฉด
answer.append(u);
string result = solution(v);
answer.append(result);
}
else { //2-2. u๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด์ด ์๋๋ฉด
answer.append("("); // 1)
string result = solution(v); // 2)
answer.append(result);
answer.append(")"); // 3)
u = u.substr(1, u.size() - 2); // 4) u์ ๋งจ ์ฒ์, ๋งจ ๋ง์ง๋ง ๋ฌธ์ ์ ๊ฑฐ
// 5) u์ ๋๋จธ์ง ๋ฌธ์๋ค ๊ดํธ ๋ค์ง์ด์ ๋ถ์ด๊ธฐ
for (int i = 0;i < u.size();i++) {
if (u[i] == '(')
answer.append(")");
else
answer.append("(");
}
}
return answer;
}
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ฑ๊ตฃ๊ธธ (0) | 2020.12.28 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค/์นด์นด์ค ์ฝํ ] ์คํ์ฑํ ๋ฐฉ (0) | 2020.11.22 |
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ฌธ์์ด ์์ถ (0) | 2020.10.05 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์ฌํ ๊ฒฝ๋ก, C++ (0) | 2020.09.21 |
[์๊ณ ๋ฆฌ์ฆ] ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ (0) | 2020.09.21 |