algorithm

올바른 괄호 / stack

juuuuuuun 2024. 5. 21. 17:42
 
설명

괄호가 입력되면 올바른 괄호이면 “YES", 올바르지 않으면 ”NO"를 출력합니다.

(())() 이것은 괄호의 쌍이 올바르게 위치하는 거지만, (()()))은 올바른 괄호가 아니다.

 

입력

첫 번째 줄에 괄호 문자열이 입력됩니다. 문자열의 최대 길이는 30이다.

 

출력

첫 번째 줄에 YES, NO를 출력한다.

 

예시 입력 1 

(()(()))(()

 

예시 출력 1

NO

 

소스 코드 1

//올바른 괄호
public class Main {
    public static String solution(String str) {
        String ans="YES";
        int cnt = 0; //괄호의 개수 카운트 변수

        // cnt가 0 이면 '(' 와 ')' 괄호 개수는 같음
        // '(' -> 1 증가 , ')' -> 1 감소
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == '(') {
                cnt++;
            } else {
                cnt--;
            }
        }

        //NO의 3가지 조건
        // 1. cnt가 0이 아닌 경우 -> 괄호의 개수가 맞지 않음
        // 2. 시작이 ) 괄호로 시작하는 경우 -> 올바른 괄호가 아님
        // 3. 끝이 ( 괄호로 끝나는 경우 -> 올바른 괄호가 아님
        if (cnt != 0 || str.charAt(0) == ')' || str.charAt(str.length() - 1) == '(') {
            ans = "NO";
        }
        return ans;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println(solution(str));

    }
}

 

소스 코드 2

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

//올바른 괄호 다른 풀이
public class Main {
    public static String solution(String str) {
        String ans="YES";
        Stack<Character> stack = new Stack<>();

        for (Character x : str.toCharArray()) {
            if (x == '(') { // '('는 스택에 다 추가
                stack.push(x);
            } else {
                // ')'가 나왔는데 스택이 비어있다면 ()) 와 같은 경우가 발생했으므로 NO 이다.
                if (stack.isEmpty()) {
                    return "NO";
                }
                // 스택에 원소가 있다면 ()가 쌍을 이루므로 하나 제거
                stack.pop();
            }
        }

        // 끝났는데 스택이 비어있지 않다면 ()( 와 같이 '('가 더 많은 경우이므로 NO 이다.
        if (!stack.isEmpty()) {
            return "NO";
        }

        return ans;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println(solution(str));

    }
}

 

 

Stack

 - Stack<Character> stack = new Stack<>(); 와 같이 생성

 - stack.push('a') : stack에 'a' 추가

 - stack.pop() : stack에서 맨 나중에 들어온 원소를 삭제한다.

 - stack.peek() : 스택에서 맨 나중에 들어온 값을 반환한다.

 - stack.isEmpty() : stack이 비어있으면 true 반환 

 - stack.size() : 원소 개수 반환

 - stack.get(2) : 스택의 세번째 원소 반환

'algorithm' 카테고리의 다른 글

크레인 인형뽑기(카카오)  (0) 2024.05.22
괄호문자제거  (0) 2024.05.22
K번째 큰 수 / TreeSet  (0) 2024.05.18
모든 아나그램 찾기  (1) 2024.05.16
매출액의 종류  (0) 2024.05.15