본문 바로가기

Algorithm/Programmers

[2020 KAKAO BLIND RECRUITMENT][문자열 처리] 괄호 변환 - Java

문제 바로가기

 

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

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

programmers.co.kr

 

괄호를 다루는 문제입니다. 파라미터의 조건이 많아서 고려해줘야 할게 비교적 적어서 쉽게 풀 수 있었씁니다.

import java.util.Stack;

public class Solution {
	public boolean isAlright(String s) {
		Stack<Character> stack = new Stack<>();
		for(int i = 0; i < s.length(); i++) {
			if(!stack.isEmpty() && stack.peek() == '(' && s.charAt(i) == ')') stack.pop();
			else stack.push(s.charAt(i));
		}
		return stack.isEmpty() == true ? true : false;
	}
	
	public String solution(String p) {		// 인풋으로 항상 균형잡인 괄호 문자열이 들어온다.
        String answer = "";
        if(isAlright(p)) return p;
        
        int lParen = 0;
        int rParen = 0;
        String u = "", v = "";
        for(int i = 0; i < p.length(); i++) {
        	if(p.charAt(i) == '(') lParen++;
        	else rParen++;
        	
        	if(lParen == rParen) {
        		u = p.substring(0, i + 1);
        		v = p.substring(i + 1);
        		break;
        	}
        }
        
        if(isAlright(u)) {
        	answer = u + solution(v);
        }
        
        else {
        	StringBuilder sb = new StringBuilder("(" + solution(v) + ")");
        	for(int i = 1; i < u.length() - 1; i++) sb.append(u.charAt(i) == '(' ? ')' : '(');
        	answer = sb.toString();
        }
        return answer;
    }
}

문제에 나와있는 흐름 그대로 코드를 작성해주면 됩니다. 입력으로 들어오는 p가 항상 균형잡힌 괄호 문자열이기 때문에 올바른 괄호 문자열인지만 따로 체크해주면 됩니다.

 

올바른 괄호 문자열인지는 스택을 사용해서 체크해줬습니다. 하나씩 스택에 넣다가 스택의 top에 있는 친구와 새로 들어올 친구가 올바른 괄호 짝지라면 top에 있는 친구를 쏙 빼주면 올바른 괄호 문자열이라면 p의 길이만큼 다 돌면 스택에 아무것도 남아있지 않을겁니다.

 

입력으로 들어온 p가 올바른 괄호 문자열인지 체크해주고 그 밑에는 문제에서 하라는 대로 고오오오대로 짜면 됩니다.

 

 

 

감사합니다!.!

30분걸림