[Java] 괄호 올바르게 변환하기
2021. 4. 25. 22:10
import java.util.*;
class Solution {
int position;
public String solution(String p) {
String answer = fixParenthesis(p);
return answer;
}
// 짝이 맞고 올바른 괄호인지 검사. 올바를 경우 true 반환
public boolean isCorrect(String p) {
int l = 0, r = 0;
boolean correct = true;
Stack<Character> stack = new Stack<>(); // stack 이용
// stack에는 짝을 이루지 못한 '(' 보관. 즉, 비어있어야 올바른 괄호
for(int i=0; i<p.length(); i++) {
if(p.charAt(i) == '(') {
l++;
stack.push('('); // '('만 stack에 넣음
}
else {
r++;
if(stack.isEmpty()) { // 첫 괄호가 ')' 일 경우 올바르지 않은 괄호
correct = false;
}
else { // 짝을 이룰 '(' 존재할 경우 빼기
stack.pop();
}
}
// 균형잡힌 괄호 문자열의 최소를 구하기 위해
// (, )의 개수가 같아지는 자리를 position에 저장
if(l == r) {
position = i+1;
return correct;
}
}
return correct;
}
public String fixParenthesis(String p) {
if(p.isEmpty()) {
return p;
}
String str;
Boolean check = isCorrect(p); // 올바른 괄호인지 검사
// 문자열을 균형잡힌 괄호 문자열 u, v로 분리
String u = p.substring(0, position);
String v = p.substring(position);
// 올바른 괄호일 경우 v에 대해 같은 과정 반복
if(check) {
return u + solution(v);
}
// 올바른 괄호가 아닐 경우 v에 같은 과정을 반복하여 얻은 문자열을 ( ) 사이에 추가
else {
str = "(" + solution(v) + ")";
}
// 그 문자열 뒤에 맨 처음과 마지막 괄호를 제외하고 나머지 괄호를 반대로 추가
for(int j=1; j<u.length()-1; j++) {
if(u.charAt(j) == '(')
str += ")";
else
str += "(";
}
return str;
}
}
'코딩테스트 (Java &)' 카테고리의 다른 글
[Java] 양방향 그래프에서 최장 경로를 가지는 노드 개수 (0) | 2021.06.12 |
---|---|
[Java] 2차원 배열 회전 변환 (0) | 2021.06.09 |
[Java] 특정 단어를 원하는 단어로 변환하는 최단 과정 (0) | 2021.05.20 |
[Java] n개의 수를 더하거나 빼서 원하는 숫자를 만들 수 있는 경우의 수 구하기 (0) | 2021.05.02 |
[C++] 두 벡터를 비교하여 중복 원소 제거하기 (0) | 2021.04.19 |