공부하는 스누피

[JAVA] 괄호 변환 - String 본문

카테고리 없음

[JAVA] 괄호 변환 - String

커피맛스누피 2020. 8. 3. 00:59

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;
        }
    }
}

 

- 결과

푸는 시간 : 30분

 

String.substring(first, last)

문자열의 일부를 리턴하는 메소드이다. 첫번째 인자만 넘길 경우, 인자로 넘긴 인덱스부터 마지막 인덱스까지의 문자열을 리턴한다.

 

String.charAt(index)

문자열에서 해당 인덱스의 문자를 반환한다.

 

 

참고

https://coding-factory.tistory.com/126

 

[Java] 문자열 자르기(Substring, Split) 사용법 & 예제

자바 스트링 클래스에는 사용하기 편리하도록 만들어놓은 여러가지 함수가 있습니다. 이번 포스팅에서는 그 함수들중 문자열 자르기에 관련된 함수들을 한번 알아보도록 하겠습니다. ▶SubStrin

coding-factory.tistory.com

 

Comments