코딩 테스트/99클럽
[99클럽] 코테 스터디 3일차 TIL - Stack
토자맨
2024. 5. 23. 21:48
문제
문제 설명
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한사항
- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
입출력 예
s | answer |
---|---|
"()()" | true |
"(())()" | true |
")()(" | false |
"(()(" | false |
풀이 방법 두 가지
처음엔 스택을 떠올리지 못해서 counting 하는 방법으로 문제를 해결했다.
- 해결 방법
- '('가 나오면 count++
- ')'가 나오면 count--
이때 실패 조건 두 가지
- count가 0인데 ')'가 나오는 경우
- 문자열의 끝까지 돌았는데 count > 0인 경우
Stack 이용하지 않고 개수를 세서 해결한 풀이
/**
스택이 아닌 개수를 세는 방식으로 푸는 방법
1. '('가 나오면 count++
2. ')'가 나오면 count--
이때 실패 조건 두 가지
- count가 0인데 ')'가 나오는 경우
- 문자열의 끝까지 돌았는데 count > 0인 경우
**/
class Solution {
boolean solution(String s) {
boolean answer = true;
int n = 0;
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch == '(') {
n++;
}
else {
if (n == 0) {
answer = false;
break;
}
n--;
}
}
if (n > 0) {
answer = false;
}
return answer;
}
}
Stack을 이용한 풀이
import java.util.Stack;
/**
스택을 이용한 풀이
1. '('가 나오면 stack에 push
2. ')'가 나오면 stack을 pop
이때 실패하는 경우 2가지
- 모든 String을 돌았는데도 stack이 비어있지 않은 경우
- stack이 비어 있는데 ')'가 나온 경우
**/
class Solution2 {
boolean solution(String s) {
boolean answer = true;
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch == '(') {
stack.push(ch);
}
else {
if (stack.isEmpty()) {
answer = false;
break;
}
stack.pop();
}
}
if (!stack.isEmpty()) {
answer = false;
}
return answer;
}
}
오늘 회고
새롭게 깨달은 내용
워낙 쉬운 문제이고 전에 풀어본 문제라 새롭게 알거나 어려웠던 부분은 없다.
내일 공부할 것
- 프레임워크 프로그래밍 프로젝트 과제 백엔드 구현 완료
- 일본어 4과 복습 및 히라가나 복습
- 99클럽 4일차 코테 문제 풀이 및 TIL 작성