카테고리 없음

[백준/JAVA] 4949번: 균형잡힌 세상

imname1am 2023. 4. 12. 21:32
반응형

🔺 문제

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

 

🔺 코드

- 틀림

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		while(true) {
		    String s = br.readLine();
		    
		    if(s == null || s.isEmpty()) break;
		    
		    s = s.replaceAll("[a-zA-Z]","").replaceAll(" ", "").replaceAll("\\.","");
		    
		    //System.out.println(s);
		    
		    Stack<String> stack = new Stack<>();
		    
		    for(int i = 0 ; i < s.length();i++) {
		        String str = s.substring(i,i+1);
		        
		        switch(str) {
		            case "(":
		                stack.push("(");
		                break;
		            case ")":
		                if(stack.isEmpty()) stack.push(")");
		                else if(!stack.isEmpty() && stack.peek().equals("("))  stack.pop();
		                break;
		            case "[":
		                stack.push("[");
		                break;
		            case "]":
		                if(stack.isEmpty()) stack.push("]");
		                else if(!stack.isEmpty() && stack.peek().equals("["))  stack.pop();	
		                break;
		        }
		    }
		    
		    if(stack.isEmpty()) System.out.println("yes");
		    else System.out.println("no");
		    
		    stack.clear();
		}
	}
}

 

 

- 정답

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		while(true) {
		    String s = br.readLine();
		    
		    if(s == null || s.isEmpty() || s.equals(".")) break;
		    
		    s = s.replaceAll("[a-zA-Z]","").replaceAll(" ", "");
		    
		    //System.out.println(s);
		    
		    Stack<Character> stack = new Stack<>();
		    boolean isValid = true;
		    
		    for(int i = 0 ; i < s.length();i++) {
		        char c = s.charAt(i);
		        
		        if(c == '(' || c == '[') {
		            stack.push(c);
		        }
		        else if(c == ')' || c == ']') {
		            if(stack.isEmpty()) {
		                isValid = false;
		                break;
		            }
		            else {
		                char top = stack.pop();
		                if((c == ')' && top != '(') || (c == ']' && top != '[')) {
		                    isValid = false;
		                    break;
		                }
		            }
		        }
		    }
		    
		    if(!stack.isEmpty()) isValid = false;
		    
		    System.out.println(isValid ? "yes" : "no");
		}
	}
}

입력의 종료조건, 맨 마지막에 온점 하나가 입력으로 들어오면 종료시켜야 하는데 틀린 코드에서는 이걸 빼먹었다.

그리고 boolean 변수를 설정해 해당 문자열이 균형 잡혀있는지 여부를 알게 했다.


🔺 다른 풀이들

 

[백준] 4949번 : 균형잡힌 세상 - JAVA [자바]

www.acmicpc.net/problem/4949 4949번: 균형잡힌 세상 하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보

st-lab.tistory.com

조건을 만족하지 않으면 바로 return "no"를 때려버리셨다.


💬 느낀 점

너무 어렵게 푼 느낌,,,

정규표현식 하고 막,,

담엔 풀이 시간을 줄여보자!

1회독 2회독 3회독 4회독 5회독
V        

 

반응형