[JAVA] 괄호 변환 - String
https://programmers.co.kr/learn/courses/30/lessons/60058
코딩테스트 연습 - 괄호 변환
카카오에 신입 개발자로 입사한 콘은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를 컴�
programmers.co.kr
생각 과정
- 균형인지 테스트는 (의 개수와 )개수가 같은지 검사하는 메소드 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
[Java] 문자열 자르기(Substring, Split) 사용법 & 예제
자바 스트링 클래스에는 사용하기 편리하도록 만들어놓은 여러가지 함수가 있습니다. 이번 포스팅에서는 그 함수들중 문자열 자르기에 관련된 함수들을 한번 알아보도록 하겠습니다. ▶SubStrin
coding-factory.tistory.com