백준 4949번 균형잡힌 세상-JAVA

sujin·2025년 2월 3일

코딩테스트-백준

목록 보기
5/18

📝문제

📝알고리즘

//BufferedReader를 사용하여 입력받음
//입력이 "."이면 종료
//isBalanced를 true로 초기화함
//열린 괄호는 스택에 push
//닫힌 괄호는 스택이 비어있거나 스택 최상단의 괄호와 짝이 맞지 않으면 isBalanced를 false로 설정함
//스택 최상단과 짝이 맞으면 스택에서 pop함
//for문을 다 순회한 이후에 스택이 비어 있는 경우에도 isBalanced를 false로 설정
//isBalanced가 true면 "yes"를 아니면 "no"를 출력

❌틀린 코드

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));
        Stack<Character> stack=new Stack<>();
        while(true){
            String input=br.readLine();
            int answer=1;
            if(input.equals("."))
                break;
            boolean isBalanced=true;
            for(int i=0; i<input.length();i++){
                char c=input.charAt(i);
                if(c=='(' || c=='['){
                    stack.push(c);
                }
                else if(c==')'){
                    if(stack.isEmpty() || stack.peek()!='('){
                        isBalanced=false;
                        break;
                    }
                    stack.pop();
                }
                else if(c==']'){
                    if(stack.isEmpty() || stack.peek()!='['){
                        isBalanced=false;
                        break;
                    }
                    stack.pop();
                }
                
            }
            if(!stack.isEmpty()){
                isBalanced=false;
            }
            System.out.println(isBalanced ? "yes": "no");
        }
    }
}

📝틀린 이유
스택을 while문 바깥에서 선언해서 스택을 제대로 초기화하지 않음➡️이전 입력에서 남아 있던 괄호가 다음 입력에도 영향을 주는 문제가 생길 수 있음

✅while문 안에서 스택을 새로 생성해서 반복문이 실행될 때마다 스택이 초기화되도록 수정함

📝수정한 코드

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));
        while(true){
            Stack<Character> stack=new Stack<>();
            String input=br.readLine();
            int answer=1;
            if(input.equals("."))
                break;
            boolean isBalanced=true;
            for(int i=0; i<input.length();i++){
                char c=input.charAt(i);
                if(c=='(' || c=='['){
                    stack.push(c);
                }
                else if(c==')'){
                    if(stack.isEmpty() || stack.peek()!='('){
                        isBalanced=false;
                        break;
                    }
                    stack.pop();
                }
                else if(c==']'){
                    if(stack.isEmpty() || stack.peek()!='['){
                        isBalanced=false;
                        break;
                    }
                    stack.pop();
                }
                
            }
            if(!stack.isEmpty()){
                isBalanced=false;
            }
            System.out.println(isBalanced ? "yes": "no");
        }
    }
}

📌기록하고 싶은 내용

문자열 비교➡️.equals()를 사용

profile
열공!

0개의 댓글