본문 바로가기
BaekJoon

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

by GrayChoi 2019. 11. 15.
반응형

오늘도 열심히.gif

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

 

4949번: 균형잡힌 세상

문제 세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다. 정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하는 프로그램을 짜는 것이다. 문자열에 포함되는 괄호는 소괄호("()") 와 대괄호("[]")로 2종류이고, 문자열이 균형을 이루는 조건은 아래와 같다. 모든 왼쪽 소괄호("(")는 오른쪽 소괄호(")")와만 짝을 이룰 수 있다. 모든 왼쪽 대괄호("[")는 오른쪽 대

www.acmicpc.net

위의 문제는 BaekJoon Online Judge의 단계별로 풀어보기 중 17단계 스택의 카테고리에 포함되어 있는 문제이다.

 

나는 자바 라이브러리에 포함된 스택을 사용하지 않고,

 

스택 알고리즘의 연습을 위해 따로 스택 클래스를 만들어 사용하였다.

 

문자열을 입력받고 '(', '[', ')', ']'를 제외한 문자들은 건너뛰며

 

'('와 '['가 입력될 땐 push() 함수를 호출하여 스택에 입력하고,

 

')'와 ']'가 입력되면 pop() 함수를 호출하여 스택에 입력되어 있던 괄호와 비교하고

 

맞으면 스택포인터 변수를 하나씩 낮추고 괄호의 짝이 맞지 않으면 -1을 리턴하여

 

괄호검사를 멈추고 no를 출력한다. 

 

import java.util.Scanner;

class Stack_World {
	private int top;
	private int size;
	private int Output;
	private char[] Brackets;
	
	public Stack_World (int size) {
		top = -1;
		this.size = size;
		Brackets = new char[this.size];
	}
	
	public void push(char item) {
		Brackets[++top] = item;
	}
	
	public int pop(char item) {
		Output = 0;
		
		if(top == -1)
			return Output = -1;
		
		if(item == ')' && Brackets[top] == '(')
			top--;
		else if(item == ']' && Brackets[top] == '[')
			top--;
		else
			Output = -1;
		
		return Output;
	}
	
	public int top() {
		return this.top;
	}
}

public class Question_4949 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		while(true) {
			int Output = 0;
			
			String Input = sc.nextLine();
			
			Stack_World stk = new Stack_World(Input.length());
			
			if(Input.charAt(0) == '.')
				break;
			
			char[] X = Input.toCharArray();
			
			for(char e : X) {
				if(e == '(' || e == '[')
					stk.push(e);
				
				if(e == ')' || e == ']')
					Output = stk.pop(e);
				
				if(Output == -1)
					break;
			}
			
			if(Output == -1 || stk.top() != -1)
				System.out.println("no");
			else
				System.out.println("yes");
			
		}
	}
}

 

블로그를 개설하여 처음 풀이를 올려본다.

 

앞으로도 꾸준히 문제풀이를 올리고 한 단계씩 더 발전하는 모습을 보여야겠다.

반응형

댓글