하루에 한 문제

[프로그래머스 2020 KAKAO BLIND RECRUITMENT] 괄호 변환 -Java 본문

알고리즘/프로그래머스

[프로그래머스 2020 KAKAO BLIND RECRUITMENT] 괄호 변환 -Java

dkwjdi 2020. 12. 14. 22:27

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

 

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

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

programmers.co.kr

import java.util.Stack;
class Solution {
		
		public String solution(String p) {
			if (p.equals("")) return ""; // 빈 문자열이라면 빈 문자열 반환
			if (isCollect(p)) return p; //올바른 문자열이라면 바로 반환 

			return solve(p);
		}

		private boolean isCollect(String p) {
			Stack<Character> stack = new Stack<>();
			for (int i = 0; i < p.length(); i++) {
				char ch = p.charAt(i);
				if (ch == '(')stack.push(ch);
				else {
					if (stack.isEmpty()) return false;
					stack.pop();
				}
			}
			return true;
		}

		private String solve(String p) {
			if(p.equals("")) return "";
			int index=divided(p);
			String u = p.substring(0, index);
			String v=p.substring(index, p.length());
			
			if(isCollect(u)) return u+solve(v);
			else return "("+solve(v)+")"+removeAndReverse(u);
		}

		private String removeAndReverse(String u) {
			String tmp="";
			u=u.substring(1, u.length()-1);
			for(int i=0; i<u.length(); i++) {
				if(u.charAt(i)=='(') tmp+=")";
				else tmp+="(";
			}
			return tmp;
		}

		private int divided(String p) {
			int flag=0;
			int i=0;
			for (; i < p.length(); i++) {
				if(p.charAt(i)=='(') flag++;
				else flag--;
				if(flag==0) break;
			}
			return ++i;
		}
	}

소요시간 : 40분

 

구현하는데 시간이 오래 걸리진 않았는데 문제를 이해하는데 시간이 오래 걸렸다.

균형 잡힌 문자열인지 올바른 괄호 문자열인지 판단하기 위해 stack을 사용했다.

 

u가 올바른 괄호 문자열이라면 u는 그대로 사용하고 v는 재귀 함수에 넣었다.

만약 u가 올바른 괄호 문자열이 아니라면 재귀 함수의 전과 후에 ( ) 를 넣어 주었고, 그 뒤에 u의 앞뒤를 자르고 괄호   방향을 반대로 해서 더해주었다.

 

사실 문제 그대로 따라 하면 풀 수 있는 문제지만 이해하는데 시간이 오래 걸렸다!

Comments