[BAEKJOON] - 4949번 : 균형잡힌 세상

Kim Hyen Su·2024년 1월 24일
0

⏲️ 알고리즘

목록 보기
49/95

4949번 문제 링크

업로드중..

위 문제는 이전에 풀었던 스택 문제에서 활용된 문제이다.

기존 문제와 차이점은 괄호 종류가 2가지(소괄호, 대괄호) 라는 것과 괄호 안에 공백과 알파벳 문자열이 포함되어 있다는 점이다.

문제 풀 때, 고려할 사항을 다음과 같이 정리했다.
1. 문자열이 "." 온점인지 확인 후 맞을 경우, 반복문 종료.
2. 균형이 맞는지 여부를 판단하는 기준은 "닫는 괄호"를 만났을 때, 괄호 종류에 맞는 "여는 괄호"가 존재하는지를 기준으로 판단.
3. 괄호 문자 이외의 다른 문자열은 무시하면 된다.

😒 실패

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        String str;
        
        while(true){
            str = br.readLine();
            if(str.equals(".")) break;
            
            Stack<Character> stack = new Stack<>();
            
            for(int i=0; i < str.length(); i++){
                char ch = str.charAt(i);

                switch(ch){
                    case '[' :
                    stack.push(ch);
                    break;
                    case '(' :
                    stack.push(ch);
                    break;
                    case ']' :
                    if(!stack.empty() && stack.peek() == '[') stack.pop();
                    break;
                    case ')' :
                    if(!stack.empty() && stack.peek() == '(') stack.pop();
                    break;
                }
            }
            
            if(stack.empty()){
                sb.append("yes");
             }else{
                 sb.append("no");
             }
             sb.append("\n");
        }
        br.close();
        System.out.println(sb);
    }
}

솔직히 아직도 위코드가 왜 오답인지 이해가 되지 않는다. 스터디원들한테 질문 해봐야겠다.

😀 성공

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        String str;
        
        while(true){
            str = br.readLine();
            
            if(str.equals(".")){
                break;
            }
            
            sb.append(solve(str)).append("\n");
        }
        br.close();
        System.out.println(sb);
    }
    
    static String solve(String str){
        Stack<Character> stack = new Stack<>();
        
        for(int i=0; i < str.length(); i++){
            char ch = str.charAt(i);
            
            if(ch == '(' || ch == '['){
                stack.push(ch);
            }else if(ch == ')'){
                if(stack.empty() || stack.peek() != '('){
                    return "no";
                }else{
                    stack.pop();
                }
            }else if(ch == ']'){
                if(stack.empty() || stack.peek() != '['){
                    return "no";
                }else{
                    stack.pop();
                }
            }
        }
        
        if(stack.empty()){
            return "yes";
        }else{
            return "no";
        }
    }
}

위처럼 메서드를 분리하여 구현하였으며, 다른 사용자의 풀이를 참고하였다.

참고 포스팅
https://st-lab.tistory.com/180

profile
백엔드 서버 엔지니어

0개의 댓글