본문 바로가기

알고리즘/카카오

2020 KAKAO BLIND RECRUITMENT - 괄호 변환

반응형

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

 

코딩테스트 연습 - 괄호 변환

카카오에 신입 개발자로 입사한 콘은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를 컴�

programmers.co.kr


import java.util.Stack;

public class Solution {

	public static String solution(String p) {
		String answer = "";
		
		
		// 1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
		if(p.equals("")) return answer;
		else {
			String u="", v="";
			int left = 0;
			int right = 0;
			
			// 문자열 w를 두 균형잡힌 괄호 문자열 u, v로 분리합니다.
			for(int i=0; i<p.length(); i++) {
				
				if(p.charAt(i) == '(') left ++ ;
				else if(p.charAt(i) == ')') right ++;
				
				if(left == right) { // u 는 균형잡힌 문자열
					u = p.substring(0, left+right);
					v = p.substring(left+right, p.length());
					break;
				}
			}
			
			// System.out.println("u : " + u + "         v :" + v);
			if(isRight(u)) { // u가 올바른 문자열이라면
				answer = u + solution(v);
			} else { // 아니면
				answer += "("; // 빈 문자열에 첫번째 문자로 '('를 붙입니다.
				answer += solution(v) + ")"; // v 에 대해 1단계부터 재귀적으로 수행한 결과를 이어 붙인다. + ) 를 붙인다.
				// u의 첫 번째와 마지막 문자를 제거하고, 
				u = u.substring(1, u.length()-1);
				// 나머지 문자열의 괄호 방향을 뒤집어서 다시 뒤에 붙인다.
				String U = "";
				for(int j=0; j<u.length(); j++) {
					if(u.charAt(j) == '(') U += ")";
					else U += "(";
				}
				answer += U;
			}
			
		}
		
		return answer;
	}
	
	public static boolean isRight(String st) {
		Stack<Character> stack = new Stack();
		
		for(int i=0; i<st.length(); i++) {
			char c = st.charAt(i);
			if(c == '(') {
				stack.push(c);
			} else { // c == ')'
				if(stack.isEmpty() || stack.peek() != '(') return false;
				else stack.pop();
			}
		}
		
		if(stack.size() == 0) return true;
		else return false;
	}
}
반응형

'알고리즘 > 카카오' 카테고리의 다른 글

2020 카카오 인턴십수식 - 최대화  (0) 2020.09.15
2019 카카오 개발자 겨울 인턴십 - 튜플  (0) 2020.09.05
키패드 누르기  (0) 2020.08.20
오픈채팅방  (0) 2020.05.29
비밀지도  (0) 2020.05.26