다희의 코딩 성장일기

[프로그래머스] level2. 괄호 변환 (자바 JAVA) 본문

Algorithm/프로그래머스

[프로그래머스] level2. 괄호 변환 (자바 JAVA)

ilmiodiario 2021. 8. 24. 21:57

[ 문제 ]  [프로그래머스] level2. 괄호 변환 (자바 JAVA)

 

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/60058

 

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

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

programmers.co.kr


# 접근 방법 및 풀이 

 

  • 이 문제 보고 올바른 괄호열로 바꿔주면 되잖아? 하고 조건말고 백준에서 풀었던 비슷한 문제? 떠올리면서 내 마음대로 코드 짰다가.. ㅎ..낭패봤다.
  • 조건은 조건대로 풀자! 주어진 조건대로 그대로 구현하면 된다.

 

# 주의할 점 

 

  • 문제에 조건 주어지면 조건대로 풀어라.
  • 주어진 조건대로 예제 풀어가면서 생각한게 맞는지 비교해보기
  • u의 "("는 -> ")"로, ")"는 "("로 변환시 주의하기.
  • 무작정 u = replace("(", ")");  u = replace(")", "("); 해버렸는데 이러면 오류난다.
  • 기존에 u가 )(였다면, u = replace("(", ")"); 를 통해 u = "))"가 될것이고
  • u = replace(")", "("); 를 통해 u = "(("가 될것이다. 그러나 우리가 원하는 값은 )( 에서 ()가 되는 것이기 때문에
  • 중간에 (를 . 으로 바꿔주고 진행했다.
  • 자세한건 코드참조!

 

JAVA 코드
public class 괄호변환 {
	 public String solution(String p) {
	      if(check(p))
	          return p;
	      return dfs(p);
	    }
	    public static boolean check(String s){ //올바른 괄호열 체크
	        Stack<Character> stack = new Stack<>();
	        for(int i = 0; i < s.length(); i++){
	            char c = s.charAt(i);
	            if(c =='(')
	                stack.add(c);
	            else{
	                if(stack.isEmpty())
	                    return false;
	                else
	                    stack.pop();
	            }
	        }
	        if(!stack.isEmpty())
	            return false;
	        return true;
	    }
	    
	    public static String dfs(String w){
	        if(w.length() == 0){ //빈 문자열 이라면 빈문자열 return
	            return "";
	        }
	        String u = ""; //더이상 분리할 수 없는 균형잡힌 괄호 문자열
	        String v = "";
	        int cnt1 = 0, cnt2= 0;
	        for(int i = 0; i < w.length(); i++){
	            char c = w.charAt(i);
	            if(c == '(')
	               cnt1++;
	            else
	               cnt2++;
	            if((cnt1 != 0 && cnt2 != 0) && cnt1 == cnt2){
	                u = w.substring(0, i+1);
	                if(i != w.length()-1){
	                    v = w.substring(i+1, w.length());
	                }
	                break;
	            }
	        }
	        if(!check(u)){//u가 올바른 괄호 문자열이 아니라면
	            String tmp = "(" + dfs(v);
	            tmp += ")";
	            u = u.substring(1,u.length()-1);
	            u = u.replace("(", ".");
	            u = u.replace(")", "(");
	            u = u.replace(".", ")");
	            tmp += u;
	            return tmp;
	        }
	        else {//u가 올바른 괄호 문자열이라면
				return u + dfs(v);
			} 
	    }
}

 

 

 

REVIEW

침착하게 빠르게 풀자!

Comments