본문 바로가기

Algorithm

[SWEA] JAVA - 1218 괄호 짝짓기

열린괄호만을 저장하고 닫힌 괄호와 가장 최근에 저장한 열린 괄호와 매칭 시켜주기 위해 스택 자료구조를 사용해서 풀었습니다.

 

만약 닫는 괄호가 왔는데 스택이 비어있다면 잘못된 괄호이고, 스택의 pop 원소와 새로 들어오는 괄호의 짝이 맞지 않아도 잘못된 괄호입니다. 이때 각 괄호마다 짝을 지어주기 위해 HashMap 의 Key-Value 특징을 사용하여 Key 값에 열린 괄호들을 넣고 Value에는 닫힌 괄호들을 넣어 서로 짝을 지어줬습니다.

 

(다른분들의 코드를 보니 case방식으로 짝을 많이 맞춰줬는데 좋은 방법인것같습니다.)

package com.ssafy.off;

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

public class SWEA_1218_Bracket {

	static char[] arr;
	static HashMap<Character,Character> bracket;
	
	private static boolean solve() {
		Stack<Character> stack = new Stack<>();
		for (int i = 0; i < arr.length; i++) {
			//열린 괄호일 경우
			if(arr[i] == '(' || arr[i] == '{' || arr[i] == '[' || arr[i] == '<') {
				stack.push(arr[i]);
			}
			//닫는 괄호일 경우
			else {
				if(stack.isEmpty()) return false;
				
				if(bracket.get(stack.pop()) != arr[i]) {
					return false;
				}
			}
		}
		
		return stack.isEmpty() ? true : false;
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		bracket = new HashMap<>();
		bracket.put('(', ')');
		bracket.put('{', '}');
		bracket.put('[', ']');
		bracket.put('<', '>');
		
		for (int t = 1; t <= 10; t++) {
			int size = sc.nextInt();
			arr = new char[size];
			String temp = sc.next();
			arr = temp.toCharArray();
			
			//solve
			int answer = solve() ? 1 : 0;
			System.out.println("#"+t+" " + answer);

		}
	}

}

'Algorithm' 카테고리의 다른 글

[SWEA] JAVA - 1223 계산기2  (0) 2021.02.05
[SWEA] JAVA - 1225 암호생성기  (1) 2021.02.05
[SWEA] JAVA - 5432.쇠막대기 자르기  (0) 2021.02.05
[백준] Python - 1316.그룹단어체커  (0) 2021.02.04
[정렬 알고리즘] - Heap Sort  (0) 2021.02.03