๐ ๋ฌธ์ ๋งํฌ
๊ดํธ ๋ณํ
์ฝ๋ฉํ
์คํธ ์ฐ์ต - ๊ดํธ ๋ณํ ๋ฌธ์ ์
๋๋ค.
๐ก ๋ฌธ์ ํ์
'('์')'๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฌธ์์ดp๊ฐ ์ฃผ์ด์ง๋ค. (์ด๊ณ ๋ซ๋ ๊ดํธ ๊ฐ์๋ ํญ์ ๊ฐ๋ค)- ๋ฌธ์ ์์ ์ ์ํ ๋ณํ ๊ท์น์ ๋ฐ๋ผ
p๋ฅผ ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด๋ก ๋ฐ๊ฟ์ ๋ฐํํด์ผ ํ๋ค. - ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด๋, ์ฌ๋ ๊ดํธ์ ๋ซ๋ ๊ดํธ๊ฐ ํญ์ ์ง์ ์ด๋ฃจ๋ฉฐ ๋ฌธ์์ด์ ์์์๋ถํฐ ์ฝ์ ๋ ๋ซ๋ ๊ดํธ๊ฐ ์ฌ๋ ๊ดํธ๋ณด๋ค ๋จผ์ ๋์ค๋ ์๊ฐ์ด ์๋ ๋ฌธ์์ด์ด๋ค.
๐๏ธ ์ ๊ทผ ๋ฐฉ๋ฒ
๋ฌธ์ ์์ ์ ์ํ ์ฌ๊ท ๋ณํ ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋๋ก ๊ตฌํํ๋ค.
p๊ฐ ๋น ๋ฌธ์์ด์ด๋ฉด ๊ทธ๋๋ก ๋ฐํํ๋ค.p๋ฅผ ๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด์ธu,v๋ก ๋ถ๋ฆฌํ๋ค.- ์์์๋ถํฐ ๊ดํธ ๊ฐ์๋ฅผ ์ธ๋ค๊ฐ ์ฌ๋ ๊ดํธ ์์ ๋ซ๋ ๊ดํธ ์๊ฐ ์ฒ์์ผ๋ก ๊ฐ์์ง๋ ์ง์ ๊น์ง๊ฐ
u, ๋๋จธ์ง๊ฐv์ด๋ค.
- ์์์๋ถํฐ ๊ดํธ ๊ฐ์๋ฅผ ์ธ๋ค๊ฐ ์ฌ๋ ๊ดํธ ์์ ๋ซ๋ ๊ดํธ ์๊ฐ ์ฒ์์ผ๋ก ๊ฐ์์ง๋ ์ง์ ๊น์ง๊ฐ
u๊ฐ ์ด๋ฏธ ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด๋ผ๋ฉดu + solution(v)๋ฅผ ๋ฐํํ๋ค.u๊ฐ ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด ์๋๋ผ๋ฉด"(" + solution(v) + ")"๋ฅผ ๋ง๋ค๊ณu์ ์ฒซ ๋ฒ์งธ์ ๋ง์ง๋ง ๋ฌธ์๋ฅผ ์ ๊ฑฐํ ๋ค, ๋จ์ ๋ฌธ์์ด์ ๊ดํธ ๋ฐฉํฅ์ ๋ชจ๋ ๋ค์ง์ด ์ด์ด ๋ถ์ธ๋ค.
- ์ ๊ณผ์ ์ ์ฌ๊ท์ ์ผ๋ก ๋ฐ๋ณตํด ์ต์ข ๊ฒฐ๊ณผ ๋ฌธ์์ด์ ์ป๋๋ค.
๊ท ํ์กํ ๋ฌธ์์ด๋ก ๋ถ๋ฆฌํ๋ ๋ถ๋ถ์ ๊ดํธ ๊ฐ์ ์นด์ดํธ๋ง์ผ๋ก ํ๋จํ ์ ์๋ค.
if (open == close) {
return new String[]{
str.substring(0, i + 1),
str.substring(i + 1)
};
}
์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ธ์ง๋ ์ฌ๋ ๊ดํธ๋ฅผ +1, ๋ซ๋ ๊ดํธ๋ฅผ -1 ๋ก ๋๊ณ ๋์ ํฉ์ด ์์๊ฐ ๋๋ ์๊ฐ์ด ์๊ณ ์ต์ข
ํฉ์ด 0 ์ธ์ง๋ก ํ๋จํ๋ค.
if (u.charAt(i) == '(') count++;
else count--;
if (count < 0) return false;
๐งฉ ์ฝ๋ ๊ตฌํ
import java.util.*;
class Solution {
public String solution(String p) {
if (p.isBlank()) return p;
String[] result = splitString(p);
String u = result[0];
String v = result[1];
// u๊ฐ ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ
if (isCorrect(u)) {
return u + solution(v);
}
// u๊ฐ ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด ์๋ ๊ฒฝ์ฐ
StringBuilder sb = new StringBuilder();
sb.append("(");
sb.append(solution(v));
sb.append(")");
// u์ ์ฒซ ๋ฒ์งธ์ ๋ง์ง๋ง ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๊ณ ๋๋จธ์ง ๊ดํธ ๋ฐฉํฅ ๋ค์ง๊ธฐ
for (int i = 1; i < u.length() - 1; i++) {
if (u.charAt(i) == '(') sb.append(')');
else sb.append('(');
}
return sb.toString();
}
private boolean isCorrect(String str) {
int count = 0;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == '(') count++;
else count--;
if (count < 0) return false;
}
return count == 0;
}
private String[] splitString(String str) {
int open = 0, close = 0;
for (int i = 0; i < str.length(); ++i) {
if (str.charAt(i) == '(') open++;
else close++;
if (open == close) {
return new String[]{
str.substring(0, i + 1),
str.substring(i + 1)
};
}
}
return new String[]{str, ""};
}
}