본문 바로가기
코딩테스트 및 알고리즘

올바른 괄호

by 영카이브 2024. 1. 10.

문제. 괄호 쌍이 올바른지 구하시오. 올바르면 "YES", 아니면 "NO"를 출력하시오

 

입력예시 

(()()))()()())))((()

 

답 : NO

 

 

나의 답변

public class Main {	
	public String solution(String str) {
		String answer = "YES"; 
		Stack<Character> stack = new Stack<>();
		for( char x : str.toCharArray()) {
			if(!stack.isEmpty()) {
				if(x=='(') stack.push(x);
				else stack.pop();
			} else {
				if(x=='(') stack.push(x);
				else answer="NO";
			}
			 
		 }
		if(!stack.isEmpty()) answer="NO";
		return answer; 
	}
	public static void main(String[] args) {
		Main T = new Main();
		Scanner sc = new Scanner(System.in);
		String str=sc.next();
		System.out.print(T.solution(str));
	}
}

 

 

또 다른 방법

import java.util.Scanner;

public class Main {
    public String solution(String str) {
        int count = 0;
        for (char x : str.toCharArray()) {
            if (x == '(') {
                count++;
            } else if (x == ')') {
                count--;
            }

            if (count < 0) {
                return "NO";
            }
        }

        if (count != 0) {
            return "NO";
        }

        return "YES";
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        System.out.print(T.solution(str));
    }
}

 

 

  • 나의 답변은 Stack을 사용해서 'LIFO'을 적용시켜 '(' 일 시 push하고 ')'일 시 pop하여 과정 중에 Stack이 비거나 과정이 다 끝났는데도 Stack이 비지않았을 경우를 구분해 "NO"를 return하게 함 
  • 또 다른 방법은 Stack을 굳이 쓰지 않는 방법이다. Stack을 사용하면 데이터를 스택에 계속 쌓아야 하므로 입력값이 클 시 메모리 사용량이 늘어날 수 있고, 코드도 더 길어질 수 있다. int 변수를 사용하면 괄호 개수를 더 간결하게 추적가능하다.