728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14eWb6AAkCFAYD 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

 

문제)

 

 

풀이)

 

효율적이지는 않지만 정말 간단하게 생각했다.

짝이 알맞게 다 있다면 [, {, (, < 의 각각의 짝들이 다 있을거니까,

boolean 배열을 이용하여 각 괄호의 짝을 찾아주는 작업을 했다.

 

내가 푼 코드에 따르면 괄호의 위치와는 상관이 없다.

 

예를 들어, 코드에서 짝을 찾는 과정은 다음과 같다.

< < ( ) > >

즉, 바깥쪽 <와 바깥쪽 >이 짝이 이루어지지 않는다는 것이다.

 

문제와의 의도와는 다르지만, 짝이 알맞게 있는지 없는지의 문제이므로 이렇게 풀어도 가능했다.

 

//import java.io.FileInputStream;
import java.util.Scanner;

public class Solution_D4_1218_괄호짝짓기 {

	public static void main(String[] args) throws Exception {
		//System.setIn(new FileInputStream("input.txt"));
		Scanner sc = new Scanner(System.in);
		for(int test_case = 1; test_case <= 10; test_case++)
		{
			int n = sc.nextInt();
			char[] arr = new char[n];	//input 배열
			boolean[] bool = new boolean[n];	//false
			String input = sc.next();
			arr = input.toCharArray();
			
			int answer = -1;
			for(int i=0; i<n; i++) {
				if(bool[i]==false) {	//탐색되지 않았으면
					switch(arr[i]) {
					case '{':{
						bool[i] = true;	//탐색
						for(int j=i+1; j<n; j++) {
							if(arr[j] == '}'&&bool[j]==false) {	//짝 찾고, 짝이 안 찾아진 애면
								bool[j]=true;
								break;
							}
						}
					}
						break;
					case '[':{
						bool[i] = true;
						for(int j=i+1; j<n; j++) {
							if(arr[j] == ']'&&bool[j]==false) {
								bool[j]=true;
								break;
							}
						}
					}
						break;
					
					case '<':{
						bool[i] = true;
						for(int j=i+1; j<n; j++) {
							if(arr[j] == '>'&&bool[j]==false) {
								bool[j]=true;
								break;
							}
						}
					}
						break;
					
					case '(':{
						bool[i] = true;
						for(int j=i+1; j<n; j++) {
							if(arr[j] == ')'&&bool[j]==false) {
								bool[j]=true;
								break;
							}
						}
					}
						break;
						
					}//switch
				}//if
			}//for
			for(int i=0; i<n; i++) {
				if(bool[i] == false) {	// 짝 없는애 있으면 0
					answer = 0;
					break;
				}
			}
			if(answer == -1)	//초기값 -1이니 0이 안 되었다는 것은 모두 짝이 있다는 것
				answer = 1;
			System.out.println("#"+test_case+" "+answer);
		}//test_case
		sc.close();
	}//main
}

 

 

 

이 문제의 정석은 stack을 활용하여 문제를 푸는 것이다.

입력값을 탐색하면서 여는 괄호를 만나면 stack에 저장하고, 닫는 괄호를 만나면 저장했던 괄호를 pop하여 잘 매칭되는지 확인한다.

 

이때, pop한 괄호와 닫는 괄호가 일치하지 않으면 틀렸으므로 0을 출력한다!

 

이 방식으로 문제를 푼다면 문제에서 원하는 방식으로 괄호 짝을 맞추면서 확인할 수 있다!

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

public class Solution_D4_1218_괄호짝짓기 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringBuilder sb = new StringBuilder();
		String opener = "<{([";//스택에 추가할 (시작)문자
		
		for (int tc = 1; tc <= 10; tc++) {
			
			int answer = 1;//기본값 1(유효)
			sb.append("#").append(tc).append(" ");
			
			int N = Integer.parseInt(br.readLine()); //괄호 개수
			String line = br.readLine(); 
			
			Stack<String> stack = new Stack<>(); //stack
			
			for (int i = 0; i < N; i++) {
				String item = line.substring(i, i + 1);  //괄호 하나
				
				if (opener.contains(item)) {//시작괄호 이면
					stack.push(item);
				} else {//끝괄호 이면
					boolean result = false;
					if (!stack.isEmpty()) {// 데이터가 있다면
						String prev = stack.pop();//스택의 끝에 저장된 시작괄호를 prev에 저장
						
						//끝괄호와 시작괄호 매칭 확인
						if (item.equals(">") && prev.equals("<")) {
							result = true;
						} else if (item.equals("]") && prev.equals("[")) {
							result = true;
						} else if (item.equals("}") && prev.equals("{")) {
							result = true;
						} else if (item.equals(")") && prev.equals("(")) {
							result = true;
						}
						
						if (!result) {// 안 맞음
							answer = 0; 
							break;
						}
					}
				}//끝괄호else
			}//for 입력N

			sb.append(answer).append("\n");
		}//tc
		System.out.println(sb);
	}//main
}
728x90

'코테 > SWEA' 카테고리의 다른 글

SWEA 1225. 암호생성기(JAVA)  (0) 2022.08.16
SWEA 2001. 파리퇴치(JAVA, Python)  (0) 2022.08.16
SWEA 2805. 농작물 수확하기(JAVA)  (0) 2022.08.12
SWEA 1873. 상호의 배틀필드(JAVA)  (0) 2022.08.10
SWEA 1954. 달팽이 숫자(JAVA)  (0) 2022.08.08

+ Recent posts