https://school.programmers.co.kr/learn/courses/30/lessons/60058
카카오 기출에서 단순 구현문제가 많은 것 같다. 문제만 잘 읽고 이해하면 구현하는 것은 어렵지 않지만 문제 읽고 이해하는거 자체가 어려운 편이다.. (개인적인 생각) 이번 문제도 마찬가지로 재귀를 이용한 구현문제이다.
문제 포인트
문제 그대로 u와 v를 분리하여 그대로 수행해주면 된다.
필자는 처음에 분리를 해야된다는 단순한 생각때문에 함수 자체에서 String[] 로 나누어서 구분해야되나 생각했었는데, 그럴 필요가 전혀 없이 DFS 함수에서 return 할 때 각 if문에 들어가는 조건대로 String으로 return 해주면 되는 방법이 있었다..
import java.util.*;
class Solution {
public String solution(String p) {
String answer = "";
answer = DFS(p);
return answer;
}
// u, v를 분리하는 함수
public String DFS(String str) {
if (str.equals(""))
return "";
String u = "";
String v = "";
int cnt = 0;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == '(')
cnt++;
else if (str.charAt(i) == ')')
cnt--;
u += str.charAt(i);
if (cnt == 0) {
v = str.substring(i + 1, str.length());
break;
}
}
if (check(u)) {
return u += DFS(v);
} else {
StringBuilder sb = new StringBuilder();
sb.append("(");
sb.append(DFS(v));
sb.append(")");
u = u.substring(1, u.length() - 1);
for (int i = 0; i < u.length(); i++) {
if (u.charAt(i) == '(')
sb.append(')');
else if (u.charAt(i) == ')')
sb.append('(');
}
return sb.toString();
}
}
// 올바른 괄호 문자열인지 판단하는 함수
public boolean check(String str) {
Stack<Character> stack = new Stack<>();
boolean flag = true;
for (int i = 0; i < str.length(); i++) {
char tmp = str.charAt(i);
if (tmp == '(') {
stack.push('(');
} else if (tmp == ')') {
if (stack.isEmpty()) {
flag = false;
break;
}
if (stack.peek() == '(')
stack.pop();
}
}
if (!stack.isEmpty())
flag = false;
return flag;
}
}
'프로그래밍 & IT > Algorithm' 카테고리의 다른 글
[알고리즘] 프로그래머스 메뉴리뉴얼 :: 우유 (0) | 2023.04.16 |
---|---|
[알고리즘] 알고리즘에서 자주 쓰는 조합(Combination) 문제 (1) | 2023.04.16 |
[알고리즘] 프로그래머스 [3차] 방금그곡 :: 우유 (0) | 2023.04.05 |
[알고리즘] 프로그래머스 네트워크:: 우유 (0) | 2023.04.04 |
[알고리즘] 프로그래머스 여행경로 :: 우유 (0) | 2023.04.03 |