티스토리 뷰

programmers.co.kr/learn/courses/30/lessons/60058?language=java

 

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

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

programmers.co.kr

    public static String solution(String p) {
        if("".equals(p)) {
            return p;
        }

        String u = "";
        String v = "";
        StringBuilder builder = new StringBuilder();

        char startBracket = p.charAt(0);
        int bracketCnt = 0;
        boolean isCorrectWord = startBracket == '(';

        for(int i = 0; i < p.length(); i++) {
            bracketCnt = startBracket == p.charAt(i) ? bracketCnt + 1 : bracketCnt - 1;

            if(bracketCnt < 0) {
                u = p.substring(0, i);
                v = p.substring(i, p.length());
                break;
            }
        }

        if(isCorrectWord) {
            if("".equals(v)) {
                return p;
            } else {
                builder.append(u);
                builder.append(solution(v));
            }
        } else {
            builder.append("(");
            builder.append(solution(v));
            builder.append(")");

            if(u.length() > 0)	{
                String tempStr = u.substring(1,u.length()-1);
                int index = 0;
                StringBuilder tempBuilder = new StringBuilder(u.substring(1,u.length()-1));
                if(tempStr.charAt(0) == ')') {
                    for(int i = 0; i < tempStr.length(); i++) {
                        if(tempStr.charAt(i) == '(') {
                            index = i;
                        }
                    }
                    tempStr = tempStr.substring(index, tempStr.length());

                    for(int i = 0; i < index; i++) {
                        tempStr += ")";
                    }
                }

                if(tempBuilder.charAt(0) == ')') {
                    tempBuilder.reverse();
                }
                builder.append(tempStr);
            }
        }
        return  builder.toString();
    }

처음 생각한 코드는 이렇다

테스트는 통과했지만 채점에서 죽죽 붉은줄이 뜬다...

여기저기 구글링을 해본 결과

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

요문장에서 reverse로 하면 12번부터 주르륵 틀린다고 나올거란거다

문장 그대로 뒤집어서 뒤에 붙여야한다

그리고 올바른 문장을 확인하는 부분이 너무 부실해서 이것도 문자열 u에 대해 확인하는 메소드로 수정했다.

    public String solution(String p) {
        if("".equals(p)) {
            return "";
        }

        String u = "";
        String v = "";
        StringBuilder builder = new StringBuilder();

        char startBracket = p.charAt(0);
        int bracketCnt = 0;

        for(int i = 0; i < p.length(); i++) {
            bracketCnt = startBracket == p.charAt(i) ? bracketCnt + 1 : bracketCnt - 1;

            if(bracketCnt == 0) {
                u = p.substring(0, i+1);
                v = p.substring(i+1, p.length());
                break;
            }
        }

        if(isCorrect(u)) {
            builder.append(u);
            builder.append(solution(v));
        } else {
            builder.append("(");
            builder.append(solution(v));
            builder.append(")");

            String tempStr = u.substring(1,u.length()-1);
            tempStr = reverse(tempStr);

            builder.append(tempStr);
        }

        return  builder.toString();
    }
    
    private static boolean isCorrect (String str) {
    	int bracketCnt = 0;
    	
    	for(int i = 0; i < str.length(); i++) {
    		bracketCnt = str.charAt(i) == '(' ? bracketCnt + 1 : bracketCnt - 1;
    		
    		if(bracketCnt < 0) 	return false;
    		
    	}
    	return true;
    }    
    
    private static String reverse (String str) {
    	StringBuilder builder = new StringBuilder();
    	for(int i = 0; i < str.length(); i++) {
    		if(str.charAt(i) == ')') {
    			builder.append('(');
    		} else {
    			builder.append(')');
    		}    		
    	}
    	return builder.toString(); 
    }

ps. )()()()( <- 요 테스트를 추가해서 디버깅해본게 나름 도움이 되었다.

 

댓글