코딩테스트/프로그래머스

[Java] 프로그래머스 - 괄호 변환 (2단계)

배똥회장 2022. 4. 28. 14:19
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

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

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

programmers.co.kr

 

 

 

 

 

import java.util.*;
class Solution {
    public String solution(String p) {
        return func(p); //func함수 자체가 String을 리턴하기 때문에 바로 리턴
    }
    
    public String func(String word) {
        if (word.equals("")) return ""; //만약 빈 문자열이면 그대로 리턴함
        
        //문자열을 붙이는 작업이 많기 때문에 시간 절약을 위해 StringBuilder 객체 선언하여 활용
        StringBuilder result = new StringBuilder();
        
        int position = 0; //u와 v를 구분하기 위한 위치를 담을 변수
        int count = 0; //균형잡힌 문자열을 알아내기 위해서 사용하는 변수
        String[] s = word.split("");
        
        //올바른 문자열인지 아닌지를 구분하기 위한 변수
        //만약 시작이 "("이면 올바른 문자열이고, 그렇지 않으면 아닌 것
        boolean value = s[0].equals(")") ? false : true; 
        
        for (int i = 0; i < s.length; i++) {
            count += (s[i].equals("(")) ? 1 : -1; //만약 s[i]가 "("면 +1을 아니면 -1을 함
            if (count == 0) { 
            	//괄호의 모양에 따라 +1 또는 -1 하면서 0이 되는 순간이 있음
                //그 순간이 괄호 숫자가 딱 떨어지는 순간이기 때문에 여기서 잘라야 함
                position = i + 1;
                break;
            }
        }
        
        String u = word.substring(0, position);
        String v = word.substring(position, word.length());
        
        if (value) { //올바른 문자열일 때
            result.append(u);
            result.append(func(v));
        } else { //올바른 문자열이 아닐 때
            result.append("(");
            result.append(func(v)); //v는 다시 처음부터 반복해서 리턴해야 하기 때문에 함수 호출
            result.append(")");
            
            char[] uSplit = u.substring(1, u.length()-1).toCharArray(); //앞 뒤 제외하고 배열 만들기
            
            for (int i = 0; i < uSplit.length; i++) { //괄호 뒤집기
                uSplit[i] = uSplit[i] == '(' ? ')' : '(';
            }

            result.append(new String(uSplit));
        }
        
        return result.toString(); //리턴값이 String이기 때문에 toString() 필수
    }
}

 

테스트 1 통과 (0.21ms, 80.9MB)
테스트 2 통과 (0.14ms, 78.8MB)
테스트 3 통과 (0.11ms, 72.7MB)
테스트 4 통과 (0.20ms, 71MB)
테스트 5 통과 (0.22ms, 76.5MB)
테스트 6 통과 (0.16ms, 73.8MB)
테스트 7 통과 (0.29ms, 73.6MB)
테스트 8 통과 (0.20ms, 77MB)
테스트 9 통과 (0.32ms, 77.2MB)
테스트 10 통과 (0.26ms, 77.6MB)
테스트 11 통과 (0.80ms, 76.2MB)
테스트 12 통과 (1.38ms, 74.5MB)
테스트 13 통과 (1.96ms, 73.7MB)
테스트 14 통과 (3.80ms, 70.1MB)
테스트 15 통과 (3.40ms, 74.3MB)
테스트 16 통과 (12.50ms, 85.6MB)
테스트 17 통과 (5.09ms, 76.5MB)
테스트 18 통과 (11.14ms, 82.8MB)
테스트 19 통과 (21.54ms, 89.8MB)
테스트 20 통과 (20.80ms, 84.5MB)
테스트 21 통과 (5.69ms, 76MB)
테스트 22 통과 (4.01ms, 80.6MB)
테스트 23 통과 (41.25ms, 91.5MB)
테스트 24 통과 (4.12ms, 75.4MB)
테스트 25 통과 (9.37ms, 74.4MB)

 

 

 

 

 

문제에서 재귀적으로 수행하라길래 진짜 재귀함수로 풀었음.

 

 

 

 

 

728x90