본문 바로가기

백준

[백준] 균형잡힌 세상 (4949번)

728x90

코드 힌트:

  1. 입력 처리
    • 사용자는 여러 줄의 문자열을 입력합니다. 입력된 문자열이 .으로 시작하지 않을 때까지 반복적으로 처리합니다.
    • input.replaceAll("[a-zA-Z.]*", "")와 input.replaceAll("\\s++", "")를 통해 괄호 외의 문자와 공백을 제거한 후 문자열을 처리합니다.
  2. 스택을 이용한 괄호 짝 검사
    • 각 문자열을 순회하며 열린 괄호 ( 또는 [는 스택에 추가합니다.
    • 닫힌 괄호 ) 또는 ]를 만날 경우, 스택의 최상단에 있는 열린 괄호와 짝이 맞는지 확인합니다.
    • 짝이 맞으면 스택에서 제거하고, 그렇지 않으면 isAble을 false로 설정해 잘못된 괄호 짝임을 표시합니다.
  3. 결과 출력
    • 문자열 순회가 끝난 후, isAble이 true이고 스택이 비어있으면 괄호가 올바르게 닫혔으므로 "yes"를 출력합니다.
    • 그렇지 않으면 "no"를 출력합니다.
  4. 반복 처리
    • 입력된 문자열이 .으로 시작하지 않으면 계속해서 입력을 받고, 위의 과정이 반복됩니다.

 


정답은 더보기 클릭

더보기
더보기
import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        
        String input = in.nextLine(); // 입력된 문자열을 한 줄 받아옴
        Stack<Character> stk = new Stack<>(); // 괄호의 짝을 확인하기 위한 스택 생성
        
        // 입력이 '.'으로 시작하지 않을 때까지 반복
        while (input.charAt(0) != '.') {
            boolean isAble = true; // 괄호가 올바른지 여부를 저장하는 변수
            stk.clear(); // 이전 입력에 대한 스택을 초기화
            input = input.replaceAll("[a-zA-Z.]*", ""); // 괄호 외의 모든 문자를 제거
            input = input.replaceAll("\\s++", ""); // 모든 공백을 제거
            
            // 입력된 문자열을 순회하며 괄호 검사
            for (char c : input.toCharArray()) {
                
                // 스택이 비어 있거나, 열린 괄호를 만나면 스택에 추가
                if (stk.isEmpty() || c == '(' || c == '[') {
                    stk.add(c); // 열린 괄호를 스택에 추가
                }
                
                // 스택의 최상단 괄호가 열리고, 짝이 맞는 닫힌 괄호를 만나면 스택에서 제거
                else if ((stk.peek() == '(' && c == ')') || (stk.peek() == '[' && c == ']')) {
                    stk.pop(); // 괄호 짝을 맞추면 스택에서 제거
                }
                
                // 짝이 맞지 않는 경우, 올바르지 않은 괄호임을 표시하고 반복 종료
                else {
                    isAble = false;
                    break; // 짝이 맞지 않으므로 더 이상 확인하지 않고 종료
                }
            }
            
            // 스택이 비어있고 모든 괄호가 올바르게 닫혔으면 'yes', 그렇지 않으면 'no' 출력
            if (isAble && stk.isEmpty())
                System.out.println("yes");
            else
                System.out.println("no");
            
            input = in.nextLine(); // 다음 입력을 받아옴
        }
    }
}
728x90

'백준' 카테고리의 다른 글

[백준] 뱀과 사다리 게임 (16928번)  (2) 2024.10.07
[백준] 감소하는 수 (1038번)  (0) 2024.10.01
[백준] 보물 (1026번)  (0) 2024.09.20
[백준] 별 찍기 - 8  (0) 2024.09.19
[백준] 북극곰은 괄호를 찢어 (25918번)  (1) 2024.09.13