공부하는 스누피
[JAVA] 괄호 변환 - String 본문
https://programmers.co.kr/learn/courses/30/lessons/60058
생각 과정
- 균형인지 테스트는 (의 개수와 )개수가 같은지 검사하는 메소드 check로 수행한다.
- 올바른 괄호는 문자열의 첫 문자는 열린 괄호여야만 하고, 마지막 문자는 닫힌 괄호여야 한다.
- 괄호 변환 알고리즘이 나와 있으니 그대로 따라 만들면 된다.
- 재귀 함수는 받은 문자열을 문자열 u, v로 나누는데, u는 균형있는 괄호이고 더이상 나눠지지 않아야 한다.
=> 받은 문자열을 순회하면서 열린 괄호의 숫자와 닫힌 괄호의 숫자가 처음으로 일치할 때 종료하고 문자열을 나누면 된다.
- u가 올바른 괄호이면 u와 재귀함수로 처리한 v를 붙이지만, 아니라면 재가공을 거쳐 올바른 괄호로 만들어야 한다.
=> 재가공은 reform 메소드를 사용한다.
- 구현
import java.util.*;
class Solution {
public String solution(String p) {
String answer = "";
if(p.length() != 0){
answer = make(p);
}
return answer;
}
public String make(String w){
String u="", v="";
//분리
int countL = 0;
int countR = 0;
for(int i=0;i<w.length();i++){
if(w.charAt(i)=='('){
countL++;
}else{
countR++;
}
if(i!=0 && (countL == countR) && i!=w.length()-1){
u = w.substring(0, i+1);
v = w.substring(i+1);
break;
}
else if(i == w.length()-1){
u = w;
v = "";
break;
}
}
StringBuffer newU = new StringBuffer();
if(u.length()>0){
if(check(u)){
newU.append(u + make(v));
}else{
newU.append("(" + make(v) + ")");
newU.append(reform(u));
}
return newU.toString();
}else{
return "";
}
}
public String reform(String u){
//괄호 뒤집기
StringBuffer bf = new StringBuffer();
for(int i=1;i<u.length()-1;i++){
if(u.charAt(i) == '('){
bf.append(')');
}else{
bf.append('(');
}
}
return bf.toString();
}
public boolean check(String p){
if(p.charAt(0) == '(' && p.charAt(p.length()-1) ==')'){
return true;
}
else{
return false;
}
}
}
- 결과
String.substring(first, last)
문자열의 일부를 리턴하는 메소드이다. 첫번째 인자만 넘길 경우, 인자로 넘긴 인덱스부터 마지막 인덱스까지의 문자열을 리턴한다.
String.charAt(index)
문자열에서 해당 인덱스의 문자를 반환한다.
참고
https://coding-factory.tistory.com/126
Comments