class Solution {
public String solution(String p) {
return dfs(p);
}
private String dfs(String p) {
if (p.isBlank())
return p;
int f1 = 0;
int f2 = 0;
int index = 0;
while (index < p.length()) {
if (p.charAt(index) == '(')
f1++;
else
f2++;
if (f1 == f2)
break;
index++;
}
String u = p.substring(0, index+1);
String v = p.substring(index+1);
return check(u) ? u + dfs(v) : "(" + dfs(v) + ")" + change(u);
}
private String change(String p) {
StringBuilder sb = new StringBuilder();
for (int i = 1; i < p.length() - 1; i++)
sb.append(p.charAt(i) == '(' ? ')' : '(');
return sb.toString();
}
private boolean check(String p) {
Stack<Character> stack = new Stack<>();
for (char c : p.toCharArray()) {
if (c == ')' && !stack.isEmpty() && stack.peek() == '(')
stack.pop();
else
stack.push('(');
}
return stack.isEmpty();
}
}
🤔문제에 주어진 과정을 그대로 로직으로 만드신다면 해결이 가능한 문제입니다.
문제가 길어서 1번부터 차근차근 해야 헷갈리지 않고 푸실 수 있습니다.
- p가 비어있다면 그대로 반환
- p를 u,v로 나누기 위해 f1,f2변수 설정 ->
while문
을 통해 p를 분리하는데f1==f2
가 되면while문
종료 그리고 해당 index를 토대로 u,v로 분리- u를 검사하였을때 정상적인 괄호라면
u + 다음 dfs()
를 수행 그렇지 않다면"(" + dfs(v) + ")" + change(u)
를 수행(로직에 나와 있는 그대로 수행하시면 됩니다.)- check()함수의 경우
stack
을 이용하여 "()"짝이 맞는지 확인하는 메소드입니다.
stack
에 "("이 들어간 상황에서 다음 차례가 ")"라면stack.pop()
으로 제거 그 이외에는
"("라는 의미로 그대로push()
- change()메소드는 문제의 4-4번 로직을 수행한 메소드로 앞뒤를 제거하기 위해 for문의 시작과 끝을 1만큼 이동 이후 하나식 검사하면서 해당 값들을 반대로 적용
🥳요구하는 상황에 맞게 로직을 구현한다면 풀 만한 문제였던 것 같습니다.
출처 : 프로그래머스 - 괄호 변환