본문 바로가기
Algorithm/Kakao

[Algorithm] 2020 KAKAO BLIND RECRUITMENT 괄호 변환

by 준그래머 2023. 7. 20.
반응형

문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

내가 제출한 코드 및 풀이

class Solution {

    public static String solution(String p) {
        return repeat(p);
    }

    public static String repeat(String p){
        if(p.isBlank()) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        String results[] = divide(p); // (1)
        String u = results[0];
        String v = results[1];

        if(isValid(u)){ // (2)
            sb.append(u).append(repeat(v));
        }
        else{ // (3)
            sb.append("(").append(repeat(v)).append(")").append(modify(u));
        }
        return sb.toString();
    }
    
    private static String[] divide(String p){
        String[] result = {"", ""};
        boolean isValid = p.substring(0, 1).equals("(");
        int count = 0;
        if(isValid) { 
            count++;
        }
        else count--;
        for(int i = 1; i < p.length(); i++){
            if(p.substring(i, i+1).equals(")")) count--;
            else count++;
            if(count == 0){ // (1-1)
                result[0] = p.substring(0, i+1);
                result[1] = p.substring(i+1);
                break;
            }
        }
        return result;
    }

    private static boolean isValid(String p){
        return p.startsWith("(");
    }

    
    private static String modify(String p){
        p = p.substring(1);
        p = p.substring(0, p.length()-1);
        if(p.isEmpty()) return "";
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < p.length(); i++){
            if(p.charAt(i) == '(') sb.append(")");
            else sb.append("(");
        }
        return sb.toString();
    }
}

(1) 두 문자열 u, v로 분리합니다.

(1-1) 문자열이 닫히는 부분이 존재하면 거기서 문자열을 u, v로 분리한다. 이때, v는 빈 문자열이어도 상관 없음

(2) u가 올바른 괄호 문자열이면 u를 더하고 v는 다시 1부터 반복

(3) 중요

u의 앞 뒤 문자를 각 각 “(”, “)” 로 변경해주고 나머지 문자는 모두 괄호를 반대 방향으로 치환해줌

그리고 v는 다시 1부터 반복

결과

 

 

 

반응형