하루에 한 문제
[프로그래머스 2020 KAKAO BLIND RECRUITMENT] 괄호 변환 -Java 본문
https://programmers.co.kr/learn/courses/30/lessons/60058
import java.util.Stack;
class Solution {
public String solution(String p) {
if (p.equals("")) return ""; // 빈 문자열이라면 빈 문자열 반환
if (isCollect(p)) return p; //올바른 문자열이라면 바로 반환
return solve(p);
}
private boolean isCollect(String p) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < p.length(); i++) {
char ch = p.charAt(i);
if (ch == '(')stack.push(ch);
else {
if (stack.isEmpty()) return false;
stack.pop();
}
}
return true;
}
private String solve(String p) {
if(p.equals("")) return "";
int index=divided(p);
String u = p.substring(0, index);
String v=p.substring(index, p.length());
if(isCollect(u)) return u+solve(v);
else return "("+solve(v)+")"+removeAndReverse(u);
}
private String removeAndReverse(String u) {
String tmp="";
u=u.substring(1, u.length()-1);
for(int i=0; i<u.length(); i++) {
if(u.charAt(i)=='(') tmp+=")";
else tmp+="(";
}
return tmp;
}
private int divided(String p) {
int flag=0;
int i=0;
for (; i < p.length(); i++) {
if(p.charAt(i)=='(') flag++;
else flag--;
if(flag==0) break;
}
return ++i;
}
}
소요시간 : 40분
구현하는데 시간이 오래 걸리진 않았는데 문제를 이해하는데 시간이 오래 걸렸다.
균형 잡힌 문자열인지 올바른 괄호 문자열인지 판단하기 위해 stack을 사용했다.
u가 올바른 괄호 문자열이라면 u는 그대로 사용하고 v는 재귀 함수에 넣었다.
만약 u가 올바른 괄호 문자열이 아니라면 재귀 함수의 전과 후에 ( ) 를 넣어 주었고, 그 뒤에 u의 앞뒤를 자르고 괄호 방향을 반대로 해서 더해주었다.
사실 문제 그대로 따라 하면 풀 수 있는 문제지만 이해하는데 시간이 오래 걸렸다!
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] H-Index -Java (0) | 2020.12.16 |
---|---|
[프로그래머스] 가장 큰 정사각형 찾기 -Java (0) | 2020.12.16 |
[프로그래머스] 가장 큰 수 -Java (0) | 2020.12.16 |
[프로그래머스 2020 KAKAO BLIND RECRUITMENT] 자물쇠와 열쇠 -Java (1) | 2020.12.14 |
[프로그래머스 2020 KAKAO BLIND RECRUITMENT] 베스트앨범 -Java (5) | 2020.12.13 |
Comments