-
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 댓글