문제설명
입력 & 출력
나의 풀이
이번 문제는 문자열에서 괄호의 균형을 확인하는 것입니다. 주어진 문자열에 대하여 소괄호 ()와 대괄호 []가 올바르게 짝을 이루는지를 판단하고, 올바르면 "yes", 그렇지 않으면 "no"를 출력해야 합니다.
보통 짝을 이루는지 확인하는 문제는 스택을 활용하면 간단히 풀 수 있습니다.
왜냐하면 스택의 특성상 LIFO구조이기 때문에 괄호의 열림과 닫힘을 간편하게 관리할 수 있기 때문입니다.
- 마지막으로 열린 괄호와 첫 번째로 닫힌 괄호의 대응
- 가장 마지막에 열린 괄호가 가장 먼저 닫혀야 합니다. 스택은 이러한 구조를 자연스럽게 지원합니다. 즉, 가장 마지막에 추가된 요소가 가장 먼저 제거되는 스택의 특성이 괄호 문제에 적합합니다.
- 중첩 구조의 처리
- 괄호는 중첩될 수 있으며, 스택은 이러한 중첩을 간단하게 관리할 수 있습니다. 각 열린 괄호를 스택에 푸시하고, 닫힌 괄호가 나올 때 스택의 탑 요소와 비교하여 일치 여부를 확인할 수 있습니다.
균형을 이루고 있는지 판단하는 함수 isBalensed함수에서는 먼저 Stack을 선언해 주고, toCharArray() 메서드를 통해 입력을 각 요소로 분리하여 char형 배열로 만들어주고, 향상된 for문을 사용하여 요소에 접근을 해줍니다.
각 라인의 요소 ch가 '(' 나 '['라면 스택에 넣어줍니다.
그리고 ch가 ')'라면 스택이 비어있으면 균형을 이루지 못한 것이기 때문에 false를 반환해 주고, pop() 메서드를 사용하여 '('가 아니라면 균형을 이루지 않았다는 의미이기 때문에 false를 반환해 줍니다.
']'도 마찬가지로 로직을 구성해 줍니다.
마지막으로 isEmpty() 메서드를 사용하여 균형을 이루고 있다면 스택은 비어있어야 하고, 각 라인을 전부 순회하고 나서도 스택에 요소가 존재한다면 균형을 이루지 못한 문자열이기 때문에 fasle가 반환되게 됩니다.
이해를 돕기 위해서 위 그림을 보면 1번 문자열 "[(Hello) , (World)]"은 모든 괄호가 스택에 push 되었다가 pop 되어서 결론적으로는 스택이 비어있어 균형을 이루는 문자열이 됩니다.
그러나 2번의 문자열 "[(Hello) , (World)] ("의 경우 마지막의 '('가 스택에 push 되어서 최종적으로 문자열을 끝까지 순회를 하고 나서 스택에는 '('가 존재하기 때문에 균형을 이루지 못하는 문자열이 됩니다.
위 그림의 경우 문자열 "[(Hello) , (World)] )"에서 마지막 괄호 ')'가 isBalanced함수에서 조건문의 isEmpty() 메서드를 만족하여 그대로 false가 반환되게 됩니다.
먼저 main문에서 빠른 입력을 위해서 Buffer를 사용하여 입력을 받아주고, 최종적으로 균형을 이루는지 결과를 저장할 StringBuilder를 초기화합니다.
그리고 문제에서 "입력의 종료조건으로 맨 마지막에 온점 하나(".")가 들어온다."라고 했기 때문에 while문을 사용하여 무한루프를 돌려주고, 각 라인을 받아줍니다. 그리고 equals() 메서드를 사용하여 종료조건의 입력이 들어오면 break를 통해 반복문을 빠져나옵니다.
그리고 균형을 이루고 있는지 판단하는 함수 isBalensed함수의 반환 값이 true면 yes, false면 no를 출력하여 마무리해 줍니다.
참고❗️
'Coding Test > 백준' 카테고리의 다른 글
[백준] 시그마 (등차 수열) (0) | 2024.11.05 |
---|---|
[백준] 구간 합 구하기 4 (누적 합, 구간 합, Prefix Sum, 11659번, Java) (0) | 2024.07.18 |
[백준] 2×n 타일링 2 (동적계획법, DP, 11727번, Java) (0) | 2024.07.16 |
[백준] 듣보잡 (HashSet, HashMap, getOrDefault, contains, sort, 1764번, Java) (0) | 2024.07.16 |
[백준] 색종이 (구현, 2차원 배열, BufferReader, 2563번, Java) (1) | 2024.07.16 |