본문 바로가기
알고리즘 공부/백준

[JAVA 40일차 / 하루 3문제] 9012번, 4949번, 12789번

by maverick11471 2025. 3. 26.

1. 9012번 괄호

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int T = Integer.parseInt(br.readLine()); // 테스트 케이스 개수
        
        StringBuilder sb = new StringBuilder(); // 결과를 저장할 StringBuilder
        
        for (int i = 0; i < T; i++) {
            String s = br.readLine();
            if (isValidParenthesis(s)) {
                sb.append("YES\n");
            } else {
                sb.append("NO\n");
            }
        }
        
        System.out.print(sb.toString()); // 한 번에 출력하여 성능 최적화
    }

    public static boolean isValidParenthesis(String s) {
        int count = 0; // '(' 개수를 저장할 변수
        
        for (char c : s.toCharArray()) {
            if (c == '(') {
                count++; // 여는 괄호 증가
            } else {
                count--; // 닫는 괄호 감소
                if (count < 0) { // 닫는 괄호가 더 많으면 NO
                    return false;
                }
            }
        }
        
        return count == 0; // 모든 괄호가 짝을 이루면 YES
    }
}

2. 4949번 균형잡힌 세상

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
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(); // 출력 최적화

        while (true) {
            String line = br.readLine();
            if (line.equals(".")) break; // 종료 조건

            sb.append(isBalanced(line) ? "yes\n" : "no\n");
        }

        System.out.print(sb.toString()); // 최종 출력
    }

    public static boolean isBalanced(String s) {
        Stack<Character> stack = new Stack<>();

        for (char c : s.toCharArray()) {
            if (c == '(' || c == '[') {
                stack.push(c); // 여는 괄호 push
            } else if (c == ')') {
                if (stack.isEmpty() || stack.pop() != '(') return false;
            } else if (c == ']') {
                if (stack.isEmpty() || stack.pop() != '[') return false;
            }
        }

        return stack.isEmpty(); // 스택이 비어 있으면 균형 잡힌 문자열
    }
}
  • 대칭인지 확인하기위해 stack을 사용하면 된다.

3. 12789번 도키도키 간식드리미

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine()); // 학생 수
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        Stack<Integer> stack = new Stack<>();
        
        int order = 1; // 간식을 받을 학생 순서
        
        for (int i = 0; i < N; i++) {
            int student = Integer.parseInt(st.nextToken());
            
            if (student == order) { // 순서가 맞으면 바로 간식 받기
                order++;
            } else {
                stack.push(student); // 대기 공간(스택)에 보관
            }

            // 스택의 맨 위 값이 현재 순서와 맞으면 계속 간식 주기
            while (!stack.isEmpty() && stack.peek() == order) {
                stack.pop();
                order++;
            }
        }

        System.out.println(stack.isEmpty() ? "Nice" : "Sad");
    }
}
  • stack.peek() 기능 : stack에서 가장 마지막에 들어온 값이 무엇인지 알려준다. pop은 숫자를 꺼내는 메서드이지만, peek은 숫자만 알려주는 메서드이다.