코딩 정복 가즈아~
Home
  • 분류 전체보기 (159)
    • 알고리즘 풀이 (149)
      • 프로그래머스 (89)
      • 백준 (59)
    • 취준 일기 (6)
    • 네트워크 정리 (1)
Home
  • 분류 전체보기 (159)
    • 알고리즘 풀이 (149)
      • 프로그래머스 (89)
      • 백준 (59)
    • 취준 일기 (6)
    • 네트워크 정리 (1)
블로그 내 검색

코딩 정복 가즈아~

(っ◔◡◔)っ ♥ 2021 취뽀하자!! ♥

  • 알고리즘 풀이/프로그래머스

    [level2] 프로그래머스 - 괄호 변환(JAVA)

    2021. 9. 9.

    by. 데롱디롱

    728x90
    전체 코드는 맨 하단에 있습니다.

     

     

    [ 문제 풀이 방법 ]

    - 문제에 나와있는 순서대로 따라가며 코드를 짠다.

     

     

    [ 코드 해설 ]

    - divide함수에서 문자열을 나눌 index를 찾는다.
       또한, Stack에서 짝을 맞춰보면서 '올바른 괄호 문자열'인지 확인하여 return한다.

    '(' 와 ')'의 수가 같아지면,
    해당 index까지의 문자열을 u, 그 뒤를 v로 나눌 수 있다.

    if (left == right)
              index = i + 1;      // 해당 index 앞, 뒤로 문자열을 잘라야 하므로, +1 해준다.

    String u = p.substring(0, index);     // 0부터 해당 index 앞까지 문자열 자름
    String v = p.substring(index);         // index부터 끝까지 문자열 자름 

     

     

    [ 전체 코드 ]

    import java.util.Stack;
    
    class Solution {
        static int index = 0;
    
        public static String solution(String p) {
            // 1 - 빈 문자열 반환
            if (p.equals(""))
                return p;
    
            // 2 - 균형잡힌 괄호 문자열 u, v로 분리
            boolean isCorrect = divide(p);
            String u = p.substring(0, index);
            String v = p.substring(index);
    
            // 3 - u가 올바른 문자열이면, v에 대해 처리
            if (isCorrect)
                return u + solution(v);
    
            // 4
            StringBuilder sb = new StringBuilder();
            sb.append("("); // 4-1
            sb.append(solution(v)); // 4-2
            sb.append(")"); // 4-3
    
            // 4-4
            for (int i = 1; i < u.length() - 1; i++) {
                if (u.charAt(i) == '(')
                    sb.append(')');
                else
                    sb.append('(');
            }
    
            // 4-5
            return sb.toString();
        }
    
        private static boolean divide(String p) {
            boolean isCorrect = true; // 올바른 괄호 문자열인가
            int left = 0, right = 0;
            Stack<Character> stack = new Stack<Character>();
    
            for (int i = 0; i < p.length(); i++) {
                char ch = p.charAt(i);
    
                if (ch == '(') {
                    stack.add('(');
                    left++;
                } else {
                    right++;
                    if (!stack.isEmpty() && stack.peek() == '(')
                        stack.pop();
                    else {
                        stack.add(')');
                        isCorrect = false;
                    }
                }
    
                if (left == right) {
                    index = i + 1;
                    break;
                }
            }
    
            return isCorrect;
        }
    }

     

     

    질문이나 틀린 것이 있으면,
    댓글 부탁드립니다. :)
    저작자표시 (새창열림)

    '알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글

    [level2] 프로그래머스 - [1차] 뉴스 클러스터링(JAVA)  (0) 2021.09.09
    [level2] 프로그래머스 - 거리두기 확인하기(JAVA)  (1) 2021.09.09
    [level2] 프로그래머스 - 메뉴 리뉴얼(JAVA)  (3) 2021.09.09
    [level2] 프로그래머스 - 단체사진 찍기(JAVA)  (0) 2021.09.03
    [level2] 프로그래머스 - 카카오프렌즈 컬러링북(JAVA)  (0) 2021.09.02

    댓글

    관련글

    • [level2] 프로그래머스 - [1차] 뉴스 클러스터링(JAVA) 2021.09.09
    • [level2] 프로그래머스 - 거리두기 확인하기(JAVA) 2021.09.09
    • [level2] 프로그래머스 - 메뉴 리뉴얼(JAVA) 2021.09.09
    • [level2] 프로그래머스 - 단체사진 찍기(JAVA) 2021.09.03
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

피할 수 없다면, 순간을 즐겨라

Designed by Nana
블로그 이미지
데롱디롱
희희.. (๑′ᴗ‵๑)

티스토리툴바