[SWEA 1218] [S/W 문제해결 기본] 4일차 - 괄호 짝짓기

업데이트:

문제

  • SWEA 1218
  • 문제의 저작권은 SW Expert Academy에 있습니다.

접근방식

문자열을 입력받아 스택에 하나씩 넣어주는데 이때 열린 괄호이면 넣어주고, 닫힌 괄호일 경우에는 스택에 넣지 말고 스택의 맨 위에 있는 열린 괄호를 pop()해서 닫힌 괄호와 일치한 괄호인지를 판단한다. 이렇게 해서 모든 짝이 맞는 경우 1을 반환하고 그렇지 않으면 0을 반환하면 된다. 스택을 이용하면 쉽게 풀리는 문제이다.

코드

import java.util.Scanner;
import java.util.Stack;

public class Swea_1218 {
	static int T, N;
	static char[] inputs;
	static Stack<Character> stack;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		for (int tc = 0; tc < 10; tc++) {
			N = sc.nextInt();
			String str = sc.next();
			inputs = new char[N];
			for (int i = 0; i < N; i++) {
				inputs[i] = str.charAt(i);
			}

			// input에서 하나씩 꺼내서 stack에 넣기
			stack = new Stack();
			int i = 0;
			int Answer = 0;
			boolean flag = true;
			while (flag) {
				// 닫힌 기호라면
				if(i == N-1) break;
				if (inputs[i] == ')' || inputs[i] == ']' || inputs[i] == '}' || inputs[i] == '>') {
					char close = inputs[i]; // 닫아주는 괄호
					char popNum = stack.pop(); // 열린 괄호
					
					// 닫아주는 괄호가 스택에서 꺼낸 열린 괄호와 같은지 확인
					switch (close) {
					case ')':
						if (popNum == '(') {
							Answer = 1;
						} else {
							Answer = 0;
							flag = false;
						}
						break;

					case ']':
						if (popNum == '[') {
							Answer = 1;
						}
						else {
							Answer = 0;
							flag = false;
						}
						break;

					case '}':
						if (popNum == '{'){
							Answer = 1;
						}
						else {
							Answer = 0;
							flag = false;
						}
						break;

					case '>':
						if (popNum == '<'){
							Answer = 1;
						}
						else {
							Answer = 0;
							flag = false;
						}
						break;
					}
				} else
					stack.push(inputs[i]);
				i++;
			}
			System.out.println("#"+(tc+1)+" "+Answer);
		}
	}
}

태그:

카테고리:

업데이트: