-
[Java] - 올바른 괄호 (12909) (Stack)알고리즘/프로그래머스 2024. 3. 15. 10:39
📚 문제 - 12909
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어 "()()" 또는 "(())()" 는 올바른 괄호입니다. ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다. '(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한사항- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
입출력 예
s answer "()()" true "(())()" true ")()(" false "(()(" false - 입출력 예 #1
문제의 예시와 같습니다.
⌨️ 작성한 코드
import java.util.Stack; class Solution { public boolean solution(String s) { Stack<Character> stack = new Stack<>(); for (char c : s.toCharArray()) { if (c == '(') { stack.push(c); } else { if (stack.isEmpty()) { // ')'인데 스택이 비어있으면 올바르지 않은 괄호 return false; } stack.pop(); // 짝이 맞는 경우 스택에서 제거 } } return stack.isEmpty(); // 순회 후, 스택이 비어있으면 올바른 괄호 } }
- 접근 방식:
")()("처럼 ")"로 시작하면 올바르지 않은 괄호이므로, 이를 토대로 조건문을 작성했다. "("로 시작하면 스택에 넣고, 아니면서 비어있으면 false를 반환한다. 비어있지 않은 경우에는 스택의 맨 위에 있는 요소를 제거한다. 순회 후 마지막에 스택이 비어있으면 올바른 괄호이므로 true를 아니면 false를 return하도록 했다.
✅ 배운 점
[ 스택(Stack) ]
데이터를 저장하고 검색할 때 사용되는 추상 자료형(ADT) 중 하나입니다. 데이터를 선형으로 저장하며, 후입선출(LIFO, Last In First Out) 원칙에 따라 동작합니다. 즉, 가장 최근에 삽입된 요소가 가장 먼저 제거됩니다.
주요 메서드:
- top: 삽입과 삭제가 일어나는 위치
- push: top위치에 새로운 데이터를 삽입하는 연산
- pop: top위치에 현재있는 데이터를 삭제하고 확인하는 연산
- peek: top위치에 현재있는 데이터를 단순 확인하는 연산
// 스택 생성 Stack<Integer> stack = new Stack<>(); // Push: 스택에 요소 추가 stack.push(1); stack.push(2); stack.push(3); // 스택: [1, 2, 3] // Peek 또는 Top: 스택의 맨 위 요소 조회 (제거하지 않음) int topElement = stack.peek(); // topElement는 3 System.out.println("Top element: " + topElement); // 출력: Top element: 3 // Pop: 스택의 맨 위 요소 제거 및 반환 int poppedElement = stack.pop(); // poppedElement는 3 System.out.println("Popped element: " + poppedElement); // 출력: Popped element: 3 // 스택 상태: [1, 2] // isEmpty: 스택이 비어 있는지 여부 확인 boolean isEmpty = stack.isEmpty(); // isEmpty는 false System.out.println("Is stack empty? " + isEmpty); // 출력: Is stack empty? false // 스택의 크기 확인 int size = stack.size(); // size는 2 System.out.println("Stack size: " + size); // 출력: Stack size: 2 // 스택 순회 및 출력 System.out.print("Stack elements: "); while (!stack.isEmpty()) { int element = stack.pop(); System.out.print(element + " "); } System.out.println(); // 개행 // 출력: Stack elements: 2 1 // 스택이 비어있는지 다시 확인 isEmpty = stack.isEmpty(); // isEmpty는 true System.out.println("Is stack empty? " + isEmpty); // 출력: Is stack empty? true
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[Java] - 문자열 나누기 (140108) (0) 2024.03.18 [Java] - 기능 개발 (42586) (Stack) (0) 2024.03.15 [Java] - 옹알이 (2) (133499) (정규 표현식 Pattern, Matcher) (0) 2024.03.14 [Java] - 실패율 (42889) (Map.Entry/ entrySet()) (0) 2024.03.14 [Java] - 최솟값 만들기 (12941) (0) 2024.03.13