Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 코딩테스트합격자되기
- 알고리즘
- redux
- json-server
- react
- react-router
- 매일메일
- 자바
- Python
- 테코테코
- createSlice
- JavaScript
- react-redux
- redux-toolkit
- 항해99
- Algorithm
- C++
- 이코테
- sw expert academy
- java
- axios
- SW
- 항해플러스
- 리액트
- useDispatch
- Get
- programmers
- 프로그래머스
- redux-saga
- maeil-mail
Archives
- Today
- Total
Binary Journey
[코딩테스트합격자되기-자바편] 문제08. 올바른 괄호 본문
반응형
💡 해당 풀이는 코딩 테스트 합격자되기 - 자바편 에서 발췌된 내용을 바탕으로 작성되었습니다.
문제
출처: 프로그래머스 - 올바른 괄호
내용
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다.
예를 들어
- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s
가 주어졌을 때, 문자열 s
가 올바른 괄호이면 true
를 반환고, 올바르지 않은 괄호이면 false
를 반환하는 solution()
함수를 완성해 주세요.
제약 조건
- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
기록하기
💡 어디까지 생각해봤는지 단계적으로 기록해봅니다.
어떤 알고리즘을 적용하려 했나요?
스택 구조를 사용해서 문제 풀이 예정입니다.
적용 근거는 무엇인가요?
'(' 괄호 뒤로는 ')'가 뒤따라와야 하고 '((((()))))' 이렇게 괄호가 연속적으로 나열된 경우 가장 바깥의 '()' 괄호에 들어가야 안의 괄호에 접근할 수 있기에 top-down 구조라고 파악하여 스택 자료 구조로 접근해야 한다고 생각했습니다.
( 좌측괄호 시 +1, 우측괄호 시 -1 적용해서 풀어도 될듯 함)
풀이
풀이 시간
시작 시각 | 종료 시각 | 총 소요 시간 |
---|---|---|
13:10 | 13:30 | 20분 |
문제 분석
제약 사항 파악 & 테스트 케이스 작성
- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
최대 O(N) 의 시간복잡도를 가져야 하지 않을까..
입력값 분석
💡 입력값을 분석하면 문제에서 요구하는 알고리즘의 시간 복잡도를 간접적으로 파악할 수 있습니다.
s | answer |
---|---|
"()()" | true |
"(())()" | true |
의사 코드 작성
💡 의사 코드는 동작 중심으로 작성하는 것이 중요합니다.
💡 의사 코드는 문제 해결 순서로 작성합니다.
💡 의사 코드를 충분히 테스트해봅니다.
solution(String s) {
// 1. (괄호를 담을 stack 생성
for (s) {
// 2. (괄호 나오면 (괄호 stack 넣기
// 3. )괄호 나오면 (괄호 stack 에서 찾기, 없으면 false return
}
// 4. (괄호 stack이 남아있다면 false return
return true;
}
구현
import java.util.Stack;
class Solution {
boolean solution(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '(') {
stack.add(c);
} else if (c == ')') {
if (stack.isEmpty() || stack.peek() != '(') {
return false;
}
stack.pop();
}
}
return stack.isEmpty();
}
}
복기하기
저자 권장 시간 | 권장 시간 복잡도 |
---|---|
30분 | O(N) |
답안과 나의 풀이를 비교해보세요
import java.util.ArrayDeque;
class Solution {
boolean solution(String s) {
ArrayDeque<Character> stack = new ArrayDeque<>();
char[] a = s.toCharArray();
for (char c : a) {
if (c == '(') {
stack.push(c)
} else {
if (stack.isEmpty() || stack.pop() == c) {
return false;
}
}
}
return stack.isEmpty();
}
}
요약하기
- 가장 가까운(최근)이라는 키워드를 보고 스택을 떠올리는 감각이 있어야 한다.
stack.isEmpty()
로 스택이 비어있는지 먼저 체크한 후pop()
한다.EmptyStackException
예외 발생 주의
push()
와pop()
메서드의 시간 복잡도는 O(1) 이다.
반응형
'Algorithm > 코딩테스트합격자되기-자바편' 카테고리의 다른 글
[코딩테스트합격자되기-자바편] 문제10. 괄호 회전하기 (2) | 2025.01.04 |
---|---|
[코딩테스트합격자되기-자바편] 문제09. 10진수를 2진수로 변환하기 (0) | 2025.01.04 |
[코딩테스트합격자되기-자바편] 문제07. 방문길이 (0) | 2025.01.02 |
[코딩테스트합격자되기-자바편] 문제06. 실패율 (2) | 2024.12.26 |
[코딩테스트합격자되기-자바편] 문제05. 행렬의 곱셈 (0) | 2024.12.26 |