예전에 레벨 1에서 봤던 괄호 문제보다 몇 단계 어려운 문제같이 느껴졌다.
문제가 상세한 요구사항이 있었는데 이를 하나씩 따라가면 답이 나오는 문제였다.
다만, 그 과정은 쉽지 않아 많이 고민했었다.
키포인트는 결국 재귀였는데 메서드를 분리해서 재귀를 구현하는 게 익숙하지 않아
디버그 모드를 많이 이용하여 풀었다.
최종 코드
import java.util.Stack;
class Solution {
public static String solution(String p) {
// 입력 문자열이 공백이면 공백반환
if(p.equals("")) {
return "";
}
int cnt = 0;
StringBuilder sb = new StringBuilder(p);
StringBuilder u = new StringBuilder();
StringBuilder v = new StringBuilder();
StringBuilder answer = new StringBuilder();
for (int i = 0; i < p.length(); i++) {
if(sb.charAt(i) == '(') {
cnt++;
} else if(sb.charAt(i) == ')') {
cnt--;
// cnt가 0이라는건 (와 )의 짝이 맞는다는것
} if(cnt == 0) {
u.append(sb.substring(0, i+1));
v.append(sb.substring(i+1));
break;
}
}
// 재귀 실행
if(IsCorrect(u.toString())) {
// 올바른 문자열이라면
return u.append(solution(v.toString())).toString();
}
// 올바른 문자열이 아니면
answer.append("(").append(solution(v.toString())).append(")");
// 앞뒤 문자 제거
u.deleteCharAt(0);
u.deleteCharAt(u.length()-1);
// 반환
answer.append(switching(u.toString()));
return answer.toString();
}
// 올바른 문자열인지 확인하는 메서드
public static boolean IsCorrect (String u) {
Stack<String> st = new Stack<>();
// 스텍에 (만 넣어주고 )를 만나면 스텍에서 제거
for (String i : u.split("")) {
if(i.equals("(")) {
st.push(i);
} if(!st.isEmpty() && i.equals(")")) {
st.pop();
}
}
// 스텍의 사이즈가 0이면 올바른 문자열
return st.size() == 0;
}
// 괄호를 뒤집는 메서드
public static String switching(String u) {
StringBuilder sbs = new StringBuilder();
for (int i = 0; i < u.length(); i++) {
if(u.charAt(i) == '(') {
sbs.append(')');
} else {
sbs.append('(');
}
}
return sbs.toString();
}
}
'코딩 테스트' 카테고리의 다른 글
(Java) 프로그래머스 뉴스 클러스터링 (0) | 2022.04.30 |
---|---|
(Java) 프로그래머스 캐시 (0) | 2022.04.28 |
(Java) 프로그래머스 오픈채팅방 (0) | 2022.03.03 |
(Java) 프로그래머스 다리를 지나는 트럭 (0) | 2022.01.23 |
(Java) 프로그래머스 소수찾기_L2 (0) | 2022.01.23 |