99클럽 코테 스터디 15일차 TIL + 균형잡힌 세상

sun·2025년 2월 12일
0
post-thumbnail

오늘의 학습 키워드 및 문제

#스택 #Stack #ArrayDeque
백준 실버4) 균형잡힌 세상

문제풀이

처음에 문제를 잘못 이해해서 애를 먹었다..
( [ ) ] => no 이어야 하는데 yes 인줄..
( ( ) ) ( [ ] ) ( ( ) ) [ [ ] ] => 이런 케이스들이 yes~

위의 기준과 예제를 참고하면서 열심히 코드를 작성했더니?! "틀렸습니다"

// )() 이 가정일 때 막힘. no 인데 yes 반환
// 위 가정일 때를 대비하여 짝이 맞지 않을 때 처리를 해줘야 함.

import java.io.*;
import java.util.*;

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 s = br.readLine();
            ArrayDeque<Character> stack = new ArrayDeque<>();
            
            if (s.equals(".")) { // . 입력 시 종료
                break;
            } else {
                for(char c : s.toCharArray()) {
                    switch(c) {
                        case ']':
                        case ')':
                            if (!stack.isEmpty() && 
                                   ((c == ']' && stack.peek() == '[') || (c == ')' && stack.peek() == '('))) {
                                stack.pop();
                            }
                            break;
                        case '[':
                        case '(':
                            stack.push(c);
                            break;
                    }
                }
                sb.append(stack.size() > 0 ? "no" : "yes").append("\n");
            }
        }
        System.out.println(sb);
        br.close();
    }
}

그렇다. 내가 작성한 코드는 처음에 닫는 괄호가 나오는 케이스를 생각하지 못한 것이다.
스택이 비어있거나, 짝이 맞지 않는 경우에는 boolean 변수를 추가하여 구분할 수 있도록 했다.

// 19136KB	184ms
import java.io.*;
import java.util.*;

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 s = br.readLine();
            
            if (s.equals(".")) { // . 입력 시 종료
                break;
            } else {
                ArrayDeque<Character> stack = new ArrayDeque<>();
                boolean isBalanced = true;
                for(char c : s.toCharArray()) {

                    switch(c) {
                        case ']':
                        case ')':
                            if (!stack.isEmpty() && 
                                   ((c == ']' && stack.peek() == '[') || (c == ')' && stack.peek() == '('))) {
                                stack.pop();
                            } else {
                                isBalanced = false; // 짝이 맞지 않으면 불균형
                            }
                            break;
                        case '[':
                        case '(':
                            stack.push(c);
                            break;
                    }
                }
                if (isBalanced && stack.isEmpty()) {
                    sb.append("yes\n"); // 균형이 맞다면 yes
                } else {
                    sb.append("no\n"); // 불균형이면 no
                }
            }
        }
        System.out.println(sb);
        br.close();
    }
}

첫번째로 작성한 코드에서 도저히 모르겠어서 GPT의 도움을 받았다..
답을 보고 나니 좀 더 생각해볼걸 그랬나 싶다.

공부한 내용정리

  • 맞는지, 아닌지 확인할 때 boolean 변수를 활용하자.
profile
Please, Steadily

0개의 댓글

관련 채용 정보