https://school.programmers.co.kr/learn/courses/30/lessons/60058

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

 

푸는데 1시간 40분정도 걸린 것 같습니다.

 

기억해야할점들

첫번째. String.substring(startindex, endindex)를 잘 계산해야합니다.

abcde 라는 5글자 문자열이 있을떄,

abcde.substring(0,1); 이라하면 a

abcde.substring(1,5); 이라하면 bcde 입니다.

 

두번째. 올바른 괄호문자열이라면 그대로 return 한다는 문제조건을 안살폈습니다.

 


//올바른 괄호문자열이라면 그대로 return

import java.io.*;
import java.util.*;
class Solution {
    
    
    public String solution(String p) {
        String answer="";
        answer = simulate(p);
        
        return answer;
    }
    
    public static String simulate(String str){

        // StringBuilder strbuilder = new StringBuilder(str);
        //1.입력이 빈문자열일경우 빈문자열반환
        if(str.length() == 0){
            // answerStringBuilder.append("");
            return "";
        }
        
        int openCnt = 0;
        int closeCnt = 0;
        boolean rightflag = true;
        //이미 올바른 괄호 문자열인지 확인합니다.
        for(int i=0;i<str.length();i++){
            if(str.charAt(i) == '(') openCnt += 1;
            else if(str.charAt(i) == ')') closeCnt += 1;
            if(closeCnt > openCnt){
                rightflag = false;
                break;
            }
        }
        
        if(openCnt == closeCnt && rightflag == true){
            return str;
        }
        
        
        //2.문자열 w를 두 "균형잡힌 괄호 문자열" u,v로 분리.
        openCnt = 0;
        closeCnt = 0;
        for(int i=0;i<str.length();i++){
            if(str.charAt(i) == '(') openCnt +=1;
            else if(str.charAt(i) == ')') closeCnt += 1;
            
            //균형잡힌괄호문자열일떄
            if(openCnt == closeCnt){
                String u = str.substring(0,i+1);
                String v = str.substring(i+1,str.length());
                
                        System.out.println("u:"+u+"v:"+v);
                //3.문자열u가 올바른지 아닌지 판단하는코드 시작
                openCnt = 0;
                closeCnt = 0;
                for(int j=0;j<u.length();j++){
                    if(u.charAt(j) == '('){ openCnt += 1;}
                    else if(u.charAt(j) == ')'){ closeCnt += 1; }
                                       
                    //4.문자열 u가 올바른 괄호 문자열이 아닐경우, 수행할것들 수행
                    //올바른 괄호문자열이 아닐경우(X)
                    if(closeCnt > openCnt){                         
                        StringBuilder empty = new StringBuilder();
                        StringBuilder uBuilder = new StringBuilder(u);
                        empty.append("(");
                        empty.append(simulate(v));
                        empty.append(")");
                        
                        uBuilder.delete(0,1);
                        uBuilder.delete(uBuilder.length()-1,uBuilder.length());
                        for(int k=0;k<uBuilder.length();k++){
                            if(uBuilder.charAt(k) == '(') {empty.append(")");}
                            else if(uBuilder.charAt(k) == ')') {empty.append("(");}
                        }
                        u = uBuilder.toString();
                        //           openCnt=0;
                        //closeCnt=0;
                        return empty.toString();
                    }
                    
                    //3.문자열 u가 "올바른 괄호 문자열"이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
                    //올바른 괄호 문자열이기에 여기까지온것임.
                    u += simulate(v);
                    return u;
                }
            }
        }
        return "";
    }
}

 

 

 

두번쨰

import java.util.*;
class Solution {
    String answer = "";
    public String solution(String p) {
        answer = simulate(p);
        System.out.print(answer);
        return answer;
    }
    
    String simulate(String w){
        if(w.equals(""))
            return "";
        
        //2.  문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다. 
        int opencnt = 0;
        int closecnt = 0;
        String u="", v="";
        for(int i=0;i<w.length();i++){
            if(w.charAt(i) == '('){
                opencnt+=1;
            }else{
                closecnt+=1;
            }
            
            if(opencnt == closecnt){
                u = w.substring(0, i+1);
                v = w.substring(i+1, w.length());
                break;
            }
        }
        
        System.out.print("u:"+u+"v:"+v);
        //3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다. 
        //3-1. 수행   한 결과 문자열을 u에 이어 붙인 후 반환합니다. 
        opencnt = 0;
        closecnt = 0;
        boolean flag = false;
        for(int i=0;i<u.length();i++){
            if(u.charAt(i) == '('){
                opencnt+=1;
            }else{
                closecnt+=1;
            }
            if(closecnt > opencnt){
                flag = true;
                break;
            }
        }
        //올바른 괄호 문자열이라면
        if(flag == false){
            u += simulate(v);
            // System.out.println("right!");
        }
        
        //올바른 괄호 문자열이 아니라면
        else if(flag == true){
            String emptystr = "(";
            emptystr += simulate(v);
            emptystr += ")";
            
            StringBuilder strbuilder = new StringBuilder();
            strbuilder.append(u);
            
            strbuilder.deleteCharAt(0);
            strbuilder.deleteCharAt(strbuilder.length()-1);
            System.out.println(strbuilder.toString());
 
            for(int i=0;i<strbuilder.length();i++){
                if(strbuilder.charAt(i) =='('){
                    emptystr += ")";
                }else{
                    emptystr += "(";
                }
            }
            return emptystr;
        }
        
        return u;   
    }
}

코드입니다.

 

+ Recent posts