Today's special moments become memories of tomorrow.

BOJ

[백준 4949번] 균형잡힌 세상 (java)

lotus lee 2019. 9. 21. 21:59

사용한 방법 : Stack

 

풀이 :

1. 왼쪽 소괄호 혹은 왼쪽 대괄호를 만나면 스택에 push한다.

2. 오른쪽 소괄호(오른쪽 대괄호)를 만났을 때, 스택의 맨 위의 문자가 왼쪽 소괄호(왼쪽 대괄호)가 아니면

   균형잡힌 문자열이 아니다.

    - 스택의 맨 위의 문자가 왼쪽 소괄호(왼쪽 대괄호)이면 pop한다.

    - 스택의 맨 위의 문자가 왼쪽 소괄호(왼쪽 대괄호)가 아니면 균형잡힌 문자열이 아니므로 반복문을 빠져나간다.

    - 스택이 비어있으면 오른쪽 소괄호(오른쪽 대괄호)를 넣는다.

3. 문자열의 길이만큼 반복문을 마쳤을 때 스택이 비어있으면 균형잡힌 문자열이고,

   스택이 비어있지 않으면 균형잡힌 문자열이 아니다.

 

전체코드

package num4949;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;

public class Main {

	public static void main(String[] args) throws Exception {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		Stack<Character> s;
		String str;

		while (!(str = br.readLine()).equals(".")) {

			s = new Stack<>();

			for (int i = 0; i < str.length(); i++) {
				char c = str.charAt(i);

				if (c == '(' || c == '[')
					s.push(c);
				else if (c == ')' || c == ']') {
					if (!s.isEmpty()) {
						char ch = s.peek();
						if ((c == ')' && ch == '(') || (c == ']' && ch == '['))
							s.pop();
						else
							break;
					} else
						s.push(c);
				}
			}

			if (!s.isEmpty())
				bw.write("no\n");
			else
				bw.write("yes\n");
		}
		bw.flush();
	}
}