어제의 나보다 성장한 오늘의 나

[프로그래머스][2020 KAKAO BLIND RECRUITMENT] 괄호 변환 본문

알고리즘/프로그래머스(Programmers)

[프로그래머스][2020 KAKAO BLIND RECRUITMENT] 괄호 변환

NineOne 2021. 4. 13. 21:54

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

 

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

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

programmers.co.kr

import java.io.*;
import java.util.*;

class Solution {
    public String solution(String p) {
        String answer = "";
        
        int bal = balanceBracket(p);
        answer = dfs(p.substring(0,bal), p.substring(bal));
        
        return answer;
    }
    
    public String dfs(String u, String v) {
        if(v.length() ==0 && u.length() ==0) return "";
    	String s = u;
    	int bal = balanceBracket(v);
    	
    	if(correctBracket(u)) {
    		s += dfs(v.substring(0,bal), v.substring(bal));
    	}
    	else {
    		s = "(";
    		s+= dfs(v.substring(0,bal), v.substring(bal));
    		s+= ")";
    		StringBuilder sb = new StringBuilder(u);
    		sb.deleteCharAt(0);
    		sb.deleteCharAt(sb.length()-1);
    		s += changeBracket(sb.toString());
    	}
    	
    	return s;
    }
    
    private String changeBracket(String substring) {
		StringBuilder sb = new StringBuilder();
		for(int i=0; i<substring.length(); i++) {
			if(substring.charAt(i) == '(') sb.append(")");
			else sb.append("(");
		}
		return sb.toString();
	}
    
    public boolean correctBracket(String str) {
    	Stack<Character> stack = new Stack<>();
    	
    	for(int i=0; i<str.length(); i++) {
    		if(str.charAt(i) == '(') stack.push('(');
    		else {
    			if(stack.size() == 0) return false;
    			else stack.pop();
    		}
    	}
    	
    	if(stack.size() == 0 ) return true;
    	else return false;
    }
    
    public int balanceBracket(String str) {
    	int left =0;
    	int right =0;
    	int index =0;
    	
    	for(int i=0; i<str.length(); i++) {
    		index++;
    		if(str.charAt(i) == '(') left++;
    		else right++;
    		
    		if(left == right) return index;
    	}
    	
    	return index;
    }
}

정리

  • 문제 그대로 이해하고 구현하면 된다.
  • 여기서 주의사항은 만약 12번 부터 안풀린다면 문자열을 역순으로 뒤집으란 얘기가 아닌 ')' -> '('  '(' -> ')' 로 변환하라는 뜻이니 참고하세요.
Comments