728x90
문제
(, ), {, }, [, ] 로 이루어진 String s가 유효한지 판단할 것
이 때, 유효하다는 것은 열리는 괄호와 닫히는 괄호가 서로 매칭되는지 여부
Example 2:
Input: s = "()[]{}"
Output: true
Example 3:
Input: s = "(]"
Output: false
풀이1
public static boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (c == '(' || c == '{' || c == '[') {
stack.push(c);
continue;
}
if (c == ')') {
if (!stack.isEmpty() && stack.peek() == '(') {
stack.pop();
} else {
return false;
}
} else if ( c == '}') {
if (!stack.isEmpty() && stack.peek() == '{') {
stack.pop();
} else {
return false;
}
} else {
if (!stack.isEmpty() && stack.peek() == '[') {
stack.pop();
} else {
return false;
}
}
}
return stack.isEmpty();
}
- Stack 사용
- s를 char 배열로 하나씩 순회
- c가 열림 괄호 중 하나라면 stack.push() 후 continue
- c가 ) 라면 stack이 비어있지 않고, stack.peek()이 ( 일 경우에 stack.pop() → 조건에 맞지 않으면 false 반환
- c가 } 라면 stack이 비어있지 않고, stack.peek()이 { 일 경우에 stack.pop() → 조건에 맞지 않으면 false 반환
- c가 ] 라면 stack이 비어있지 않고, stack.peek()이 [ 일 경우에 stack.pop() → 조건에 맞지 않으면 false 반환
- stack.isEmpty() 반환 : 비어있지 않으면 false, 비어있으면 true
- 시간복잡도 : O(N)
풀이2
public static boolean isValid2(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (c == '(' || c == '{' || c == '[') {
stack.push(c);
} else {
if (stack.isEmpty()) {
return false;
}
char top = stack.peek();
if ((c == ')' && top == '(') || (c == ']' && top == '[') || (c == '}' && top == '{')) {
stack.pop();
} else {
return false;
}
}
}
return stack.isEmpty();
}
- 풀이1과 로직은 동일
- 조건문을 좀 더 다듬은 것
'JAVA > Coding Test Study' 카테고리의 다른 글
[Easy] LeetCode - no.21 Merge Two Sorted Lists : Java (0) | 2024.10.21 |
---|---|
[Easy] LeetCode - no.141 Linked List Cycle : Java (0) | 2024.10.21 |
[Easy] LeetCode - no.228 Summary Ranges : Java (0) | 2024.10.19 |
[Easy] LeetCode - no.219 Contains Duplicate II : Java (0) | 2024.10.17 |
[Easy] LeetCode - no.202 Happy Number : Java (0) | 2024.10.17 |