티스토리 뷰

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

 

코딩테스트 연습 - 괄호 변환

카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를

programmers.co.kr

풀이법:

1) 문제 설명에 나와있는 단계 그대로 풀면 끝이다...

 

Comment:

1) 재귀 말곤 특이사항이 없는 문제

class Solution {
	public static String solution(String p) {
		if(p.isEmpty()) return "";
		
		if(isBalanced(p) && isValid(p)) return p;
				
		StringBuilder u = new StringBuilder();
		String v = "";
		
		int len = p.length();
	
		int idx = 0;
		
		for(int i = 0 ; i < len; i++) {
			char cur = p.charAt(i);
			u.append(cur);
			
			if(isBalanced(u.toString())) {

				v = p.substring(i+1);
				break;
			}
		}
		
		if(isValid(u.toString())) {
			return u.toString()+""+solution(v);
		}else {
			StringBuilder sb = new StringBuilder();
			sb.append('(');
			sb.append(solution(v));
			sb.append(')');
			u.deleteCharAt(0);
			u.deleteCharAt(u.length()-1);
			String rev = reverse(u.toString());
			sb.append(rev);
		
			return sb.toString();	
		}
	}
	
	public static String reverse(String p) {
		int len = p.length();
		StringBuilder sb = new StringBuilder();
		
		for(int i = 0 ; i < len; i++) {
			char c = p.charAt(i);
			
			if(c == '(') sb.append(')');
			else sb.append('(');
		}
		
		return sb.toString();
	}
	
	public static boolean isValid(String p) {
		int count = 0;
		int len = p.length();
		
		for(int i = 0 ; i < len; i++) {
			
			char cur = p.charAt(i);
			
			if(cur == '(') count++;
			else count--;
			
			if(count < 0) return false;
			
		}
		if(count == 0) return true;
		else return false;
	}
	
	public static boolean isBalanced(String p) {
		int count1 = 0;
		int count2 = 0;
		
		int len = p.length();
		if(len % 2 != 0) return false;
		
		for(int i = 0; i < len; i++) {
			char cur = p.charAt(i);
			if(cur == '(') count1++;
			else count2++;
			
			if(count1 == count2 && count1 > 0 && count2 > 0)
		    	return true;
		}
		return false;
	}
}