(Java) 프로그래머스 괄호 변환

2022. 3. 6. 16:53·코딩 테스트

예전에 레벨 1에서 봤던 괄호 문제보다 몇 단계 어려운 문제같이 느껴졌다.

문제가 상세한 요구사항이 있었는데 이를 하나씩 따라가면 답이 나오는 문제였다.

다만, 그 과정은 쉽지 않아 많이 고민했었다.

키포인트는 결국 재귀였는데 메서드를 분리해서 재귀를 구현하는 게 익숙하지 않아

디버그 모드를 많이 이용하여 풀었다.

 

최종 코드

import java.util.Stack;
class Solution {
    public static String solution(String p) {
        // 입력 문자열이 공백이면 공백반환
        if(p.equals("")) {
            return "";
        }
        int cnt = 0;
        StringBuilder sb = new StringBuilder(p);
        StringBuilder u = new StringBuilder();
        StringBuilder v = new StringBuilder();
        StringBuilder answer = new StringBuilder();

        for (int i = 0; i < p.length(); i++) {
            if(sb.charAt(i) == '(') {
                cnt++;
            } else if(sb.charAt(i) == ')') {
                cnt--;
                // cnt가 0이라는건 (와 )의 짝이 맞는다는것
            } if(cnt == 0) {
                u.append(sb.substring(0, i+1));
                v.append(sb.substring(i+1));
                break;
            }
        }

        // 재귀 실행
        if(IsCorrect(u.toString())) {
            // 올바른 문자열이라면
            return u.append(solution(v.toString())).toString();
        }

        // 올바른 문자열이 아니면
        answer.append("(").append(solution(v.toString())).append(")");
        // 앞뒤 문자 제거
        u.deleteCharAt(0);
        u.deleteCharAt(u.length()-1);
        // 반환
        answer.append(switching(u.toString()));
        return answer.toString();
    }

    // 올바른 문자열인지 확인하는 메서드
    public static boolean IsCorrect (String u) {
        Stack<String> st = new Stack<>();
        // 스텍에 (만 넣어주고 )를 만나면 스텍에서 제거
        for (String i : u.split("")) {
            if(i.equals("(")) {
                st.push(i);
            } if(!st.isEmpty() && i.equals(")")) {
                st.pop();
            }
        }
        // 스텍의 사이즈가 0이면 올바른 문자열
        return st.size() == 0;
    }

    // 괄호를 뒤집는 메서드
    public static String switching(String u) {
        StringBuilder sbs = new StringBuilder();
        for (int i = 0; i < u.length(); i++) {
            if(u.charAt(i) == '(') {
                sbs.append(')');
            } else {
                sbs.append('(');
            }
        }
        return sbs.toString();
    }
}

'코딩 테스트' 카테고리의 다른 글

(Java) 프로그래머스 뉴스 클러스터링  (0) 2022.04.30
(Java) 프로그래머스 캐시  (0) 2022.04.28
(Java) 프로그래머스 오픈채팅방  (0) 2022.03.03
(Java) 프로그래머스 다리를 지나는 트럭  (0) 2022.01.23
(Java) 프로그래머스 소수찾기_L2  (0) 2022.01.23
'코딩 테스트' 카테고리의 다른 글
  • (Java) 프로그래머스 뉴스 클러스터링
  • (Java) 프로그래머스 캐시
  • (Java) 프로그래머스 오픈채팅방
  • (Java) 프로그래머스 다리를 지나는 트럭
로승리
로승리
  • 로승리
    Roy's Blog
    로승리
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Issuefy
      • Language
      • Spring
      • Database
      • Network
      • Kubernetes
      • AWS
      • 코드스쿼드
      • 코딩 테스트
      • 생각정리
      • 국비지원
      • 회고
      • 컨퍼런스, 세미나
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
로승리
(Java) 프로그래머스 괄호 변환
상단으로

티스토리툴바