HS_development_log

프로그래머스 카카오2020 - 괄호 변환 / Java 본문

Algorithm-프로그래머스

프로그래머스 카카오2020 - 괄호 변환 / Java

DevHyeonseong 2020. 2. 3. 21:32
반응형

문제

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

 

코딩테스트 연습 - 괄호 변환 | 프로그래머스

카카오에 신입 개발자로 입사한 콘은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를 컴파일하여 로그를 보니 대부분 소스 코드 내 작성된 괄호가 개수는 맞지만 짝이 맞지 않은 형태로 작성되어 오류가 나는 것을 알게 되었습니다. 수정해야 할 소스 파일이 너무 많아서 고민하던 콘은 소스 코드에 작성된 모든 괄호를 뽑아서 올바른 순서대로 배치된 괄호 문자열을 알려주는

programmers.co.kr

문제를 쪼개서 푸는 분할정복 문제. 재귀함수 방식을 이용하면된다.

알고리즘을 문제에서 다 알려줬기 때문에 따라서 구현만 하면된다.

문제이해를 잘하고 재귀함수의 작동 방식을 잘 이해해서 풀면 어렵지 않은 문제.

 

 

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
 * KAKAO2020 괄호 변환
 * 2020.02.03
 * Hyeonseong 
 */
import java.util.*;    
public class KakaoBlind2020_2 {
    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.solution("()))((()"));
    }
}
class Solution{
    public String solution(String input) {
        if(input.equals("")) { // 빈 문자열이면 리턴
            return "";
        }
        else {
            int cnt = 0;
            String u = "";
            for(int i=0;i<input.length();i++) {
                if(input.charAt(i)=='(') {
                    cnt++;
                } else {
                    cnt--;
                }
                if(cnt==0) { // 균형잡힌 괄호문자열이 나왔다
                    u = input.substring(0,i+1); // u를 만들어주고
                    if(!check(u)) { // u가 올바른 괄호 문자열이 아니면 작업실행
                        String temp = "(";
                        temp += solution(input.substring(i+1,input.length())); //v에 대해 재귀적수행
                        temp += ")";                    
                        String temp2 = "";
                        for(int j=1;j<u.length()-1;j++) {
                            if(u.charAt(j)=='(') {
                                temp2+=')';
                            } else {
                                temp2+='(';
                            }
                        }
                        temp+=temp2;
                        return temp; // 문자열반환
                    }
                    u+=solution(input.substring(i+1,input.length())); //올바른 괄호문자열 이어붙이기
                    break// 작업이 끝났으므로 break
                }
            }
            return u;
        }
    }
    public boolean check(String u) {
        int cnt = 0;
        for(int i=0;i<u.length();i++) {
            if(u.charAt(i)=='(') {
                cnt++;
            } else {
                cnt--;
            }
            if(cnt<0) { // 닫는괄호가 여는괄호보다 1개라도 먼저나올경우 )( 이런형태가 되므로 올바르지 않은 괄호 문자열
                return false;
            }
        }
        return true;
    }
}
cs

 

 

반응형