▶ URL
https://school.programmers.co.kr/learn/courses/30/lessons/12909?language=java
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
▶ 문제
▶ 코드 및 리뷰
🌰 풀이 아이디어
- 여는 괄호 '('는 스택에 쌓고(push)
- 닫는 괄호 ')'를 만나면, 스택에서 꺼낸다(pop)
- 쌍이 맞을 때만 pop하고, 쌍이 안 맞으면 push
- 모든 문자를 처리하고 나서 스택이 비어 있다면 올바른 괄호
🐿️ 예시 실행 흐름
예시 1: "()()"
- '(' → push
- ')' → '('와 쌍 → pop
- '(' → push
- ')' → '('와 쌍 → pop
→ 스택 비었음 → ✅ true
예시 2: "(())"
- '(' → push
- '(' → push
- ')' → '('와 쌍 → pop
- ')' → '('와 쌍 → pop
→ 스택 비었음 → ✅ true
예시 3: "(()"
- '(' → push
- '(' → push
- ')' → '('와 쌍 → pop→ 스택에 '(' 하나 남음 → ❌ false
🌰 코디가 작성한 코드에 대한 추가 설명
1. 사전 검사를 통해, 불필요한 연산 줄이기
// 마지막이 '('라면 false
if (s.charAt(s.length() - 1) == '(') return false;
문자열의 마지막 문자가 '(' 인 경우, 반드시 짝이 맞지 않습니다.
왜냐하면 '('는 반드시 그 뒤에 ')'가 와야 짝이 맞는데, 마지막이면 닫힐 수 없기 때문이죠!
예시 1) "(()" → ❌
예시 2) "(())(" → ❌
2. 반복문으로 한 글자씩 스택으로 검사
for (int i = 0; i < s.length(); i++) {
char temp = s.charAt(i);
문자열을 처음부터 끝까지 하나씩 확인합니다.
현재 문자를 temp에 저장했습니다.
1단계: 스택이 비어 있다면 push
if (stack.isEmpty()) {
stack.push(temp);
continue;
}
- 스택이 비어 있다는 건 아직 비교할 짝이 없다는 의미!
- 따라서 현재 문자가 '('이든 ')'이든 일단 넣고 다음 문자로 넘어갑니다.
2단계: 괄호 짝이 맞는 경우 (즉시 pop)
if (temp == ')' && stack.peek() == '(') {
stack.pop(); // 괄호 쌍이 맞으므로 제거
continue;
}
- 현재 문자가 ')'이고, 스택 top에 '('가 있다면 → ✅ 괄호 쌍이 맞다는 것!
- 이때는 짝을 맞춰 없애기 위해 pop()을 합니다.
- 이후는 검사할 필요 없이 바로 continue!
3단계: 괄호 쌍이 맞지 않으면 push
else {
stack.push(temp);
continue;
}
- 쌍이 안 맞는 경우는 무조건 스택에 넣었어요.
4단계 : 최종 판단
return stack.isEmpty();
- 반복문이 끝났을 때, 스택이 비어있다면 모든 괄호가 짝을 이루었다는 뜻
- 스택에 뭔가 남아 있다면 → 짝이 맞지 않음 → ❌
제출한 코드
import java.util.*;
import java.io.*;
class Solution {
boolean solution(String s) {
Stack<Character> stack = new Stack<>();
// 마지막이 '('라면 false
if (s.charAt(s.length()-1) == '(') return false;
for(int i=0; i<s.length(); i++) {
char temp = s.charAt(i);
// 스택에 아무것도 없으면 넣기
if(stack.isEmpty()) {
stack.push(temp);
continue;
}
// 스택 안에 ')'가 없으면 스택에 넣기
if(temp == ')' && stack.peek() == '('){
stack.pop();
continue;
} else {
stack.push(temp);
continue;
}
}
return stack.isEmpty();
}
}
오늘도 즐거운 코딩🌰
수정, 지적할 사항이 있다면 댓글로 알려주세요! 🐿️
'코테' 카테고리의 다른 글
[백준] 10818 최소, 최대 (0) | 2025.01.22 |
---|---|
[백준] 1269 대칭 차집합 (1) | 2024.09.08 |
[백준] 1764 듣보잡 (0) | 2024.09.08 |
[프로그래머스] 암호 해독 (1) | 2024.07.23 |
[프로그래머스] 옷가게 할인 받기 (0) | 2024.07.03 |