1) 문제 접근 방법
- 문제의 조건에 따라, 재귀함수를 구현해서 문제를 해결했다.
- 문자열 w를 두 균형잡힌 문자열 u, v로 분리해야 하는데,
이 때, open과 close의 길이가 일치할 때를 기준으로 판단해줬다
- u, v로 분리한 이후에는, u가 '올바른 괄호 문자열'인지를 판단해줬다.
이를 위한 isRight 메소드를 선언했다.
- isRight 메소드는 스택을 통해서 올바른 괄호 문자열인지 판단해줬다
- u가 올바른 괄호 문자열이라면 3-1에 따라 재귀를 수행하고,
아니라면 4에 따라 작업을 수행했다
- 4를 수행하는 과정에서 getNewU라는 메소드를 통해서 새로운 u를 구해서 반환했다.
2) 소스 코드
import java.util.*;
class Solution {
public boolean isRight(String u){
Stack<Character> stk = new Stack<>();
for(int i=0; i<u.length(); i++){
if(u.charAt(i) == '('){
stk.push('(');
}else{
if(stk.size() == 0){
return false;
}
stk.pop();
}
}
if(stk.size() == 0){
return true;
}
return false;
}
public String getNewU(String u){
int uLen = u.length();
String tmp = u.substring(1, uLen-1);
String ans = "";
for(Character c: tmp.toCharArray()){
if(c == '('){
ans += Character.toString(')');
}else{
ans += Character.toString('(');
}
}
return ans;
}
public String recursive(String p){
if(p.equals("")){
return "";
}
int open = 0;
int close = 0;
String u = "";
String v = "";
for(int i=0; i<p.length(); i++){
if(p.charAt(i) == '('){
open += 1;
}else{
close += 1;
}
if(open == close){
u = p.substring(0, i+1);
v = p.substring(i+1);
boolean res = isRight(u);
if(res){
return u + recursive(v);
}else{
break;
}
}
}
String tmp = "";
tmp += Character.toString('(');
tmp += recursive(v);
tmp += Character.toString(')');
tmp += getNewU(u);
return tmp;
}
public String solution(String p) {
String answer = "";
if(p.equals("")){
return answer;
}
answer = recursive(p);
return answer;
}
}
3) 소스 코드 리팩토링
- open==close일 때, break 한후에, for문 바깥에서 처리를 해줬다.
import java.util.*;
class Solution {
public boolean isRight(String u){
Stack<Character> stk = new Stack<>();
for(int i=0; i<u.length(); i++){
if(u.charAt(i) == '('){
stk.push('(');
}else{
if(stk.size() == 0){
return false;
}
stk.pop();
}
}
if(stk.size() == 0){
return true;
}
return false;
}
public String getNewU(String u){
int uLen = u.length();
String tmp = u.substring(1, uLen-1);
String ans = "";
for(Character c: tmp.toCharArray()){
if(c == '('){
ans += Character.toString(')');
}else{
ans += Character.toString('(');
}
}
return ans;
}
public String recursive(String p){
if(p.equals("")){
return "";
}
int open = 0;
int close = 0;
int pos = 0;
String u = "";
String v = "";
for(int i=0; i<p.length(); i++){
if(p.charAt(i) == '('){
open += 1;
}else{
close += 1;
}
if(open == close){
pos = i;
break;
}
}
u = p.substring(0, pos+1);
v = p.substring(pos+1);
boolean res = isRight(u);
if(res){
return u + recursive(v);
}else{
String tmp = "";
tmp += Character.toString('(');
tmp += recursive(v);
tmp += Character.toString(')');
tmp += getNewU(u);
return tmp;
}
}
public String solution(String p) {
String answer = "";
if(p.equals("")){
return answer;
}
answer = recursive(p);
return answer;
}
}
'PS' 카테고리의 다른 글
| 인구이동 [BOJ 16234] (0) | 2023.08.12 |
|---|---|
| 문자열 압축 [프로그래머스] (0) | 2023.06.25 |
| 후보키 [프로그래머스] (1) | 2023.06.03 |
| 캐시 [프로그래머스] (0) | 2023.06.03 |
| 뉴스 클러스터링 [프로그래머스] (0) | 2023.06.03 |