728x90
SMALL
1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.
3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.
4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.
4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
4-3. ')'를 다시 붙입니다.
4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
4-5. 생성된 문자열을 반환합니다.
문제 이해
- 문자열의 괄호는 "(", ")" 의 개수가 같은 "균형잡힌 괄호 문자열"이다. 알고리즘을 수행해 "올바른 괄호 문자열"로 변환하게 만들어야 한다.
- 문자열을 받았을때 빈문자열, "올바른 괄호 문자열" 로 받는다면 그대로 값을 리턴해준다.
- 문제 풀이를 보면 재귀적으로 수행하여 결과를 문자열을 이어 붙여라 ~ 라고 되어있다. DFS 방법으로 재귀식으로 풀었다.
- 문자열을 u = " 균형잡힌 괄호 문자열 " , v = " 균형잡힌 괄호 문자열 " 로 분리한다.
- 문자열의 길이만큼 반복하면서 "(" 나오면 ++, ")" 나오면 -- 를 하면서 cnt값이 0이되는 값의 index로 u,v 로 나누었다.
- u가 "올바른 괄호 문자열" 라면 return u + dfs(v)
- u가 "올바른 괄호 문자열"이 아니라면 return "(" + dfs(v) + ") + u의 첫번째 마지막 문자열 제외한 모든괄호를 뒤집은 문자열
- 재귀를 돌면서 완성된 문자열이 "올바른 괄호 문자열"이 될때까지 실행한다.
class Solution {
public String solution(String p) {
String answer = "";
if("".equals(p) || checkYn(p)) return p;
return dfs(p);
}
public String dfs(String p){
if(checkYn(p)) return p;
int cnt = 0;
String u = "";
String v = "";
for(int i = 0; i<p.length(); i++){
String tmp = p.substring(i,i+1);
if("(".equals(tmp)){
cnt++;
}else if(")".equals(tmp)){
cnt--;
}
if(cnt == 0){
u = p.substring(0,i+1);
v = p.substring(i+1);
break;
}
}
if(checkYn(u)){
return u + dfs(v);
}else{
String str = "";
for(int i = 1; i<u.length()-1; i++){
if("(".equals(u.substring(i,i+1))){
str += ")";
}else{
str += "(";
}
}
return "(" + dfs(v) + ")" + str;
}
}
// 올바른 괄호 문자열 체크
public boolean checkYn(String str){
int cnt = 0;
for(int i = 0; i<str.length(); i++){
String tmp = str.substring(i,i+1);
if("(".equals(tmp)){
cnt++;
}else if(")".equals(tmp)){
cnt--;
}
if(cnt < 0) return false;
}
return true;
}
}
728x90
LIST
'자바 > 코딩테스트' 카테고리의 다른 글
[프로그래머스] 두 큐 합 같게 만들기 - Java(자바) (0) | 2024.05.22 |
---|---|
[프로그래머스] 거리두기 확인하기 - Java(자바) (0) | 2024.05.21 |
[프로그래머스] [1차] 프렌즈4블록 - Java(자바) (1) | 2024.04.26 |
[프로그래머스] 단어 변환 - Java(자바) (1) | 2024.04.12 |
[프로그래머스] 삼각 달팽이 - Java(자바) (0) | 2024.04.09 |