백준

백준 4949: 균형잡힌 세상(java)

unhyepnhj 2024. 7. 12. 21:11

문제


풀이

 

BufferedReader로 입력받은 값을 toCharArray() 메소드를 이용해 문자 배열 inputChar에 저장하고, inputChar의 길이가 1이고 inputChar[0]이 '.'이면 전체 반복을 종료하도록 한다.

 

그 외의 경우, 입력 문자가 왼쪽 괄호('(', '[')이면 스택에 입력값을 push하고, 오른쪽 괄호(')', ']')이면 pop한 값과 비교해 옳은 입력인지 판단한다.

  • 왼쪽 괄호의 개수와 오른쪽 괄호의 개수가 동일한지(stack.empty())
  • 방금 입력된 괄호가 스택에 가장 최근에 삽입된 괄호와 쌍이 맞는지

만 검사하면 되므로, 괄호가 아닌 문자에 대해서는 따로 연산할 필요가 없다.

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

public class Main {
	public static void main(String[] args) throws IOException{
		BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
		
		while(true) {
			char[] inputChar=in.readLine().toCharArray();
			
			if(inputChar.length==1 && inputChar[0]=='.')
				return;
			
			Stack<Character> stack=new Stack<>();
			boolean isBalanced=true;
			
			for(int i=0; i<inputChar.length; i++) {
				char ch=inputChar[i];
				
				switch(ch) {
				case '(': case '[':
					stack.push(ch);
					break;
				case ')':
					if(stack.empty() || stack.pop()!='(') 
						isBalanced=false;
					break;
				case ']':
					if(stack.empty() || stack.pop()!='[') 
						isBalanced=false;
					break;
				}
				if(!isBalanced) break;
			}//end of for
			
			if(!stack.empty()) 
				isBalanced=false;
			
			if(isBalanced)
				System.out.println("yes");
			else
				System.out.println("no");
		}	
	}
}

 

기타 참고

https://sysouthelloworld.tistory.com/98

 

스택의 응용: 괄호 검사 문제

괄호가 올바르게 사용되었는지 스택을 사용하여 검사한다. 괄호의 검사 조건은 아래와 같다.조건 1: 왼쪽 괄호의 개수와 오른쪽 괄호의 개수가 동일조건 2: 같은 종류의 괄호에서 왼쪽 괄호는

sysouthelloworld.tistory.com

위 글에서는 C언어로 구현했지만 원리 자체는 동일하다.