ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [알고리즘] 백준 - 균형 잡힌 세상(스택)
    Algorithm 2024. 4. 18. 16:51

     

    백준 - 균형 잡힌 세상

    https://www.acmicpc.net/problem/4949

     

    문제

    세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다.

    정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하는 프로그램을 짜는 것이다.

    문자열에 포함되는 괄호는 소괄호("()") 와 대괄호("[]")로 2종류이고, 문자열이 균형을 이루는 조건은 아래와 같다.

    1. 모든 왼쪽 소괄호("(")는 오른쪽 소괄호(")")와만 짝을 이뤄야 한다.

    2. 모든 왼쪽 대괄호("[")는 오른쪽 대괄호("]")와만 짝을 이뤄야 한다.

    3. 모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재한다.

    4. 모든 괄호들의 짝은 1:1 매칭만 가능하다. 즉, 괄호 하나가 둘 이상의 괄호와 짝지어지지 않는다.

    5. 짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다.

     

    예시

    각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에 온점 하나(".")가 들어온다. 각 줄마다 해당 문자열이 균형을 이루고 있으면 "yes"를, 아니면 "no"를 출력한다.

     
    // 예시 입력
    So when I die (the [first] I will see in (heaven) is a score list).
    [ first in ] ( first out ).
    Half Moon tonight (At least it is better than no Moon at all].
    A rope may form )( a trail in a maze.
    Help( I[m being held prisoner in a fortune cookie factory)].
    ([ (([( [ ] ) ( ) (( ))] )) ]).
     .
    .
    
    // 예시 출력
    yes
    yes
    no
    no
    no
    yes
    yes
     
     
    풀이
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.HashMap;
    import java.util.Stack;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            HashMap<Character, Character> bracketMap = new HashMap<>();
            bracketMap.put(')', '(');
            bracketMap.put(']', '[');
    
            while (true) {
                String line = br.readLine();
                // . 하나만 입력시 입력 종료
                if (line.equals(".")) break;
                // 라인의 마지막에는 .으로 끝남
                if (line.length() > 1 && line.endsWith(".")) {
                    line = line.substring(0, line.length() - 1);
                    System.out.println(solution(line, bracketMap) ? "yes" : "no");
                }
            }
        }
    
        public static boolean solution(String line, HashMap<Character, Character> bracketMap) {
            // 왼쪽 브라켓 넣는 스택
            Stack<Character> leftBracketStack = new Stack<>();
    
            for (char c : line.toCharArray()) {
                if (bracketMap.containsValue(c)) {  // 열린 괄호인 경우
                    stack.push(c);
                } else if (bracketMap.containsKey(c)) {  // 닫힌 괄호인 경우
                    if (stack.isEmpty() || stack.pop() != bracketMap.get(c)) {
                        return false;  // 괄호의 짝이 맞지 않음
                    }
                }
            }
            // 남은 스택이 없으면 모든 브라켓을 사용한 경우기 때문에 통과
            return leftBracketStack.isEmpty();
        }
    }

     

    입력부분은 종료한다는데 .을 찍어서 종료한다는 의미를 못알아들어서 GPT를 좀 사용했다.

    코딩테스트 합격자 되기 자바편에 144페이지와 유사한 스택 문제이다.

    댓글

Designed by Tistory.