프로그래머스 KAKAO BLIND2020 괄호 변환 LEVEL2 ( 문자열, 재귀 ) JAVA
풀이
문자열과 재귀를 잘 다룰 수 있는지 물어보는 문제였다.
문제를 잘읽고 잘따라가면 풀 수 있다.
소스 코드
package kakao;
import java.util.Stack;
public class Bracket2020 {
public static void main(String[] args) {
String test = ")(";
String res = solution(test);
System.out.println(res);
}
public static String solution(String p) {
String answer = "";
if (isCorrect(p)) {
answer = p;
return answer;
}
answer = solve(p, "");
return answer;
}
public static String solve(String u, String v) {
if (u.length() == 0) {
return u;
}
int idx = 0;
for (int i = 0; i < u.length(); i++) {
int left = 0;
int right = 0;
for (int j = 0; j <= i; j++) {
if (u.charAt(j) == '(') {
left++;
} else {
right++;
}
}
if (left == right) {
idx = i;
break;
}
}
String temp = u;
String nStr = "(";
u = temp.substring(0, idx + 1);
v = temp.substring(idx + 1, temp.length());
if (isCorrect(u)) {
u += solve(v, "");
} else {
String res = solve(v, "");
nStr = nStr + res + ")";
u = u.substring(1, u.length() - 1);
for (int i = 0; i < u.length(); i++) {
if (u.charAt(i) == '(') {
nStr += ")";
} else {
nStr += "(";
}
}
u = nStr;
}
return u;
}
// 올바른 문자열인지 체크합니다.
public static boolean isCorrect(String s) {
Stack<Character> st = new Stack<>();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ')') {
if (!st.isEmpty()) {
Character top = st.peek();
if (top == '(') {
st.pop();
} else {
return false;
}
} else {
return false;
}
} else {
st.push(s.charAt(i));
}
}
if (st.isEmpty())
return true;
else
return false;
}
}
'Algorithm' 카테고리의 다른 글
프로그래머스 광고 삽입 KAKAO BLIND 2021 ( 누적 합 ) JAVA (0) | 2021.04.18 |
---|---|
프로그래머스 KAKAO BLIND 2020 가사 검색 LEVEL4 ( 트라이 ) JAVA (0) | 2021.04.14 |
프로그래머스 KAKAO BLIND 2020 문자열 압축 LEVEL2 ( 문자열, 스택 ) JAVA (0) | 2021.04.13 |
BOJ 1005번 ACM Craft ( 위상정렬, DP ) JAVA (0) | 2021.04.10 |
BOJ 2623번 음악프로그램 ( 위상 정렬 ) JAVA (0) | 2021.04.10 |