-
알고리즘) 카카오 블라인드 채용 2020, 괄호 변환알고리즘/프로그래머스 카카오 2020. 5. 1. 16:03반응형
Kakao Blind Recruitment 2020
괄호 변환
문제
1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.
3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.
4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.
4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
4-3. ')'를 다시 붙입니다.
4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
4-5. 생성된 문자열을 반환합니다.풀이
처음에는 어떻게 풀어야할지 막막한 느낌이 들었는데, 저 조건을 본 이후에는 금방 풀었다.
정말 친절하게 이 문제의 풀이 로직을 설명해주고 있다. 균형잡힌 괄호 문자열이란, "(" 와 ")"의 갯수가 같은 문자열이란 의미이다.
그 중 u는 처음으로 균형잡힌 괄호 문자열이 되는 시점까지의 부분 문자열이고, 나머지가 v가 되는 것이다.
u에 대해 올바른 문자열인지 확인하고 여부에 따라 위의 설명대로 진행하면 된다.
코드
public class Problem2_2019 { static String go(String w){ if(w.equals("")) { return w; } // 2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. //단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다. int len = w.length(); int index = -1; int left = 0; int right = 0; // 균형잡힌 문자열로 분리해봅시다. '('의 갯수와 ')' 갯수가 일치하게 되는 시점까지 잘라서 u를 만들어주면 됩니다. for(int i = 0 ; i < len ; i++ ){ if(w.charAt(i) == '('){ left++; }else{ right++; } if(left == right){ index = i; break; } } String u = w.substring(0, index+1); String v = w.substring(index+1); // 나머지는 v가 됩니다. StringBuilder sb = new StringBuilder(); // 3. 문자열 u가 올바른 문자열인지 판단합니다 if(isRightStr(u)) { // 3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다. // 3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다. sb.append(u).append(go(v)); } else { // 4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다. // 4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다. // 4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다. // 4-3. ')'를 다시 붙입니다. sb.append("(").append(go(v)).append(")"); // 4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다. StringBuffer tmp = new StringBuffer(u); tmp = tmp.deleteCharAt(tmp.length()-1); tmp = tmp.deleteCharAt(0); u = tmp.toString(); for(int i = 0 ; i < u.length(); i++){ if(u.charAt(i) == '('){ sb.append(")"); }else{ sb.append("("); } } } // 4-5. 생성된 문자열을 반환합니다. return sb.toString(); } private static boolean isRightStr(String u) { int stack =0; for(int i = 0 ; i < u.length() ; i++){ if(u.charAt(i) == '(') { stack++; } else if(stack == 0) { // 스택에 ( 문자가 없으면 return false; } else { stack--; } } return true; } public static String solution(String p) { String result = p; if(!isRightStr(p)) { // 완성된 문자열이 아니면 result = go(p); } return result; } public static void main(String[] args) { String p = ")("; // String p = "(()())()"; // String p = "()))((()"; String answer = solution(p); System.out.println(answer); } }
반응형'알고리즘 > 프로그래머스 카카오' 카테고리의 다른 글
알고리즘) 카카오 블라인드 채용 2020, 기둥과 보 설치 (2) 2020.05.07 알고리즘) 2019 카카오 개발자 겨울 인턴십, 징검다리 건너기 (0) 2020.05.07 알고리즘) 카카오 블라인드 채용 2020, 가사 검색 (0) 2020.05.03 알고리즘) 카카오 블라인드 채용 2020, 자물쇠와 열쇠 (0) 2020.05.01 알고리즘) 카카오 블라인드 채용 2020, 문자열 압축 (0) 2020.05.01