유블로그

[프로그래머스] 괄호변환 본문

알고리즘

[프로그래머스] 괄호변환

yujeong kang 2021. 1. 18. 20:08

[프로그래머스] level2 괄호변환

 

소요시간 : 1시간4분

 

문제 중간에

'4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.'

이 말을 u를 역순으로 뒤집으라는 말인줄 알고,,,,,,,,, 제출하면 계속 반만 맞길래 왜지 했는데

괄호 방향을 바꾸라는 게 ( -> ), ) -> (   이거였다.....

이것때문에 시간을 많이 썼다...

 

 

문제 자체는 크게 어렵지 않았다.

문제가 하라는 대로만 해주면 되고(process 함수),

올바른 문자열인지 체크하는 함수(isCorrect)와  u,v 로 나누는 함수(splictIdx)만 생각하면 됐었다.

 

class Solution {
    public String solution(String p) {
        return process(p);
    }
    
    public String process(String p) {
    	if(p.length() == 0) return "";
    	if(isCorrect(p)) return p;
    	
    	int idx = splitIdx(p);
    	String u = p.substring(0, idx+1);
    	String v = p.substring(idx+1);
    	
    	if(isCorrect(u)) return u+=process(v);
    	else {
    		StringBuilder sb = new StringBuilder();
    		sb.append("(").append(process(v)).append(")");

    		String newU = u.substring(1, u.length()-1);
    		if(newU.length() > 0) {
	    		StringBuilder newSb = new StringBuilder();
	    		int i = 0;
	    		char c;
	    		while(i < newU.length()) {
	    			if(newU.charAt(i++) == '(') c = ')';
	    			else c = '(';
	    			newSb.append(c);
	    		}
	    		sb.append(newSb);
    		}
    		return sb.toString();
    	}
    }
    
    boolean isCorrect(String s) {
    	int cnt = 0;
    	for (int i = s.length()-1; i >= 0; i--) {
			if(cnt == 0 && s.charAt(i) == '(') return false;
			if(cnt > 0 && s.charAt(i) == '(') cnt--;
			else if(s.charAt(i) == ')') cnt++;
		}
    	
    	return true;
    }
    int splitIdx(String s) {
    	int a = 0, b = 0;
    	for (int i = 0; i < s.length(); i++) {
    		if(s.charAt(i) == '(') a++;
    		else b++;
    		
    		if(a==b) return i;
		}
    	return s.length()-1;
    }
}