다희의 코딩 성장일기
[프로그래머스] level2. 괄호 변환 (자바 JAVA) 본문
[ 문제 ] [프로그래머스] level2. 괄호 변환 (자바 JAVA)
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/60058
# 접근 방법 및 풀이
- 이 문제 보고 올바른 괄호열로 바꿔주면 되잖아? 하고 조건말고 백준에서 풀었던 비슷한 문제? 떠올리면서 내 마음대로 코드 짰다가.. ㅎ..낭패봤다.
- 조건은 조건대로 풀자! 주어진 조건대로 그대로 구현하면 된다.
# 주의할 점
- 문제에 조건 주어지면 조건대로 풀어라.
- 주어진 조건대로 예제 풀어가면서 생각한게 맞는지 비교해보기
- u의 "("는 -> ")"로, ")"는 "("로 변환시 주의하기.
- 무작정 u = replace("(", ")"); u = replace(")", "("); 해버렸는데 이러면 오류난다.
- 기존에 u가 )(였다면, u = replace("(", ")"); 를 통해 u = "))"가 될것이고
- u = replace(")", "("); 를 통해 u = "(("가 될것이다. 그러나 우리가 원하는 값은 )( 에서 ()가 되는 것이기 때문에
- 중간에 (를 . 으로 바꿔주고 진행했다.
- 자세한건 코드참조!
JAVA 코드
public class 괄호변환 {
public String solution(String p) {
if(check(p))
return p;
return dfs(p);
}
public static boolean check(String s){ //올바른 괄호열 체크
Stack<Character> stack = new Stack<>();
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
if(c =='(')
stack.add(c);
else{
if(stack.isEmpty())
return false;
else
stack.pop();
}
}
if(!stack.isEmpty())
return false;
return true;
}
public static String dfs(String w){
if(w.length() == 0){ //빈 문자열 이라면 빈문자열 return
return "";
}
String u = ""; //더이상 분리할 수 없는 균형잡힌 괄호 문자열
String v = "";
int cnt1 = 0, cnt2= 0;
for(int i = 0; i < w.length(); i++){
char c = w.charAt(i);
if(c == '(')
cnt1++;
else
cnt2++;
if((cnt1 != 0 && cnt2 != 0) && cnt1 == cnt2){
u = w.substring(0, i+1);
if(i != w.length()-1){
v = w.substring(i+1, w.length());
}
break;
}
}
if(!check(u)){//u가 올바른 괄호 문자열이 아니라면
String tmp = "(" + dfs(v);
tmp += ")";
u = u.substring(1,u.length()-1);
u = u.replace("(", ".");
u = u.replace(")", "(");
u = u.replace(".", ")");
tmp += u;
return tmp;
}
else {//u가 올바른 괄호 문자열이라면
return u + dfs(v);
}
}
}
REVIEW
침착하게 빠르게 풀자!
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] level2. 다음 큰 숫자 (자바 JAVA) (0) | 2021.08.25 |
---|---|
[프로그래머스] level1. 소수 만들기 (자바 JAVA) (0) | 2021.08.25 |
[프로그래머스] level2. 올바른 괄호 (자바 JAVA) (0) | 2021.08.24 |
[프로그래머스] level2. 최댓값과 최솟값 (자바 JAVA) (0) | 2021.08.24 |
[프로그래머스] level2. 땅따먹기 (자바 JAVA) (0) | 2021.08.24 |
Comments