요르딩딩

프로그래머스 : 괄호변환 (String.CharAt(), 재귀) 본문

[코딩테스트]/문제풀이

프로그래머스 : 괄호변환 (String.CharAt(), 재귀)

요르딩딩 2022. 5. 13. 17:27
728x90
반응형

이번문제는 딱 문제를 읽었을때는 무슨소리야~~ 하면서 기분이 좋지 않았다ㅋㅋㅋㅋㅋ

 

그러나 이해하고 아래의 구현순서을 확인하니 감이 생겼고, 간단한 손코딩 후 바로 구현하기 시작했다.

 

구현순서가 자세히 나와있어, 구현하는데는 그다지 어렵지 않았던거 같다. 이 문제는 문제 이해가 핵심이다.

 

여기서 주요하게 생각하는 포인트를 알아보자.

 

1. String문자열은 CharAt을 이용하여 배열형태로 사용할 수 있다. (문자열.toCharArray()를 사용하면 바로 변환된다.)

2. 재귀를 사용한다. 재귀가 구현할때 고려해야할 부분들이 많아 어렵게 느껴지겠지만, 이 문제는 시키는대로만 구현하면 된다.

3. 추가로 괄호의 갯수 파악하기, 괄호 반대로 적용하기 등등 조금만 생각하면 쉽게 구현할 수 있다.

class Solution {
    public String solution(String p) {
        String answer = "";
        String u="", v="";
        
       if(p.isEmpty()) return ""; 
        
        String[] arr = p.split("");

        int leftCnt = 0, rightCnt = 0;
        for(int i=0; i < arr.length; i++) {
        	String a = arr[i];
        	
        	if("(".equals(a))  //왼쪽 괄호 수
        		leftCnt++;
        	else //오른쪽 괄호 수
        		rightCnt++;	
        	
        	if(leftCnt == rightCnt) { //균형잡힌 괄호 문자열일 경우 = u 
        		u = p.substring(0, i+1);
        		v = p.substring(i+1, arr.length); //나머지 = v
        		break; //종료
        	}
        }
        
        if(this.rightCheck(u) == true ) { //u가 옳바은 괄호 문자열일 경우
        	answer += u; 
        	String reV = this.solution(v); // v에 대해 1단계 부터 다시 시작
        	answer += reV;
        	
        }else {
        	String reV = this.solution(v); // v에 대해 1단계 부터 다시 시작
        	
        	String tmpU ="";
        	if(u.length() > 2) {
        		tmpU = u.substring(1, u.length()-1); //앞뒤 자르기
        	}

        	String tmp = "";
        	for(int i=0; i < tmpU.length(); i++) {
        		if('(' == tmpU.charAt(i))
        			tmp +=")";
        		else 
        			tmp +="(";
        	}
        	String tmpFinal = "(" + reV + ")" + tmp;
        	answer += tmpFinal; // 그대로인 값 뒤에붙인다.
        }
        return answer;
    }
    
    public boolean rightCheck(String k) { // 옳바른 괄호 문자열인지 판단
    	boolean result = false;
    	
    	String[] arr = k.split("");
    	
    	int cnt =0;
    	for(String a : arr) {
    		if("(".equals(a)) {
    			cnt++;
    		}else {
    			cnt--;
    		}
    		
    		if(cnt <0) { //cnt가 음수인 순간 옳지 못한 괄호라고 판단
    			return false;
    		}
    	}
    	return true;
    }
}
728x90
반응형
Comments