균형잡힌 세상

26 June 2019

문제 : https://www.acmicpc.net/problem/4949

이번은 주어진 문자열이 올바른 괄호열인지 판단하는 문제를 풀어보도록 하겠습니다.

import java.util.Scanner;

public class Main {

	public static void main(String args[]) {

		Scanner sc = new Scanner(System.in);

		Stack stack = new Stack(100);

		while (true) {
			String val = sc.nextLine();
			if (val.equals(".")) {
				break;
			}
			stack.init();
			String ret = solve(stack, val);
			System.out.println(ret);
		}
	}

	private static String solve(Stack stack, String val) {

		for (int k = 0; k < val.length(); k++) {
			switch (val.charAt(k)) {
			case '(':
				stack.push(1);
				break;
			case '[':
				stack.push(2);
				break;
			case ')':
				if (stack.pop() != 1) {
					return "no";
				}
				break;
			case ']':
				if (stack.pop() != 2) {
					return "no";
				}
				break;
			default:
				break;
			}
		}

		if (stack.isEmpty()) {
			return "yes";
		} else {
			return "no";
		}
	}
}

class Stack {
	private int top = -1;
	private int[] queue;

	Stack(int max) {
		queue = new int[max];
	}

	void init() {
		this.top = -1;
	}

	void push(int val) {
		top++;
		queue[top] = val;
	}

	int pop() {
		if (top == -1) {
			return -1;
		}
		int val = queue[top];
		top--;
		return val;
	}

	boolean isEmpty() {
		return top == -1;
	}
}
먼저 class를 통해 stack을 구현해주도록 합니다.
stack을 구현할 때, empty인 경우에 pop을 호출할 때는 -1을 리턴해주도록 합니다.
입력값을 받아 괄호가 시작하는 경우인 '(','['때는 각각 1,2를 stack에 넣어주고, 괄호를 닫는 경우인 ')',']'의 경우에는 pop을 해서 각각 1과 2가 나오는지 확인합니다.
각각의 값이 맞지않을 때는 "NO", 그리고 문자열의 조회가 모두 끝나고 stack에 값이 남아있는 경우도 "NO"를 리턴하도록 합니다.