티스토리 뷰
더 깔끔한 노션을 원한다면
설계
-
괄호의 종류는 '(', ')', '[', ']' 총 4개이다.
-
각 괄호에 따라 sum을 바꿔준다.
'(' 일 때에는 sum*=2
'[' 일 때에는 sum*=3
')' 일 때에는 sum/=2
']' 일 때에는 sum/=3
-
마지막 stack이 비어있는지 확인해준다.
1. '('와 '['일 경우
case '(':
sum *= 2;
stack.push(ch);
break;
case '[':
sum *= 3;
stack.push(ch);
break;
'('일 때에는 sum에 2를, '['일 때에는 sum에 3을 곱해준 뒤, stack에 넣어준다.
2. ')'와 ']'일 경우
case ')':
if (stack.isEmpty() || stack.pop() != '(') {
return 0;
}
case ')':
if (stack.isEmpty() || stack.pop() != '(') {
return 0;
}
if (S.charAt(i - 1) == '(')
answer += sum;
sum /= 2;
break;
case ']':
if (stack.isEmpty() || stack.pop() != '[') {
return 0;
}
if (S.charAt(i - 1) == '[')
answer += sum;
sum /= 3;
break; answer += sum;
sum /= 2;
break;
case ']':case ')':
if (stack.isEmpty() || stack.pop() != '(') {
return 0;
}
if (S.charAt(i - 1) == '(')
answer += sum;
sum /= 2;
break;
case ']':
if (stack.isEmpty() || stack.pop() != '[') {
return 0;
}
if (S.charAt(i - 1) == '[')
answer += sum;
sum /= 3;
break;
if (stack.isEmpty() || stack.pop() != '[') {
return 0;
}
if (S.charAt(i - 1) == '[')
answer += sum;
sum /= 3;
break;
이 때 주의할 점은 stack이 비어있는지(isEmpty), stack의 pop이 올바른 괄호인지 확인해줘야 한다.
그러고 나서 문자열의 전 문자가 짝이 맞는 괄호라면 answer에 sum을 더해준다.
이러한 수식이 나오는 이유는 다음과 같다.
(()[[]])([])
[1] => 2 * (2 + (3 * 3)) + (2*3)
[2] => (2*2) + (2*3*3) + (2*3)
[1]을 [2]로 풀어서 계산하기 때문에 전 문자가 짝이 맞는지 확인해주는 것이다.
3. 마지막에 stack이 비어있는지 확인
if (!stack.isEmpty()) {
return 0;
}if (!stack.isEmpty()) {
return 0;
}
전체 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
Baekjoon solution = new Baekjoon();
System.out.println(solution.P2504());
}
}
class Baekjoon {
Stack<Character> stack = new Stack<>();
public int P2504() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String S = br.readLine();
int answer = 0;
int sum = 1;
int stringSize = S.length();
for (int i = 0; i < stringSize; i++) {
char ch = S.charAt(i);
switch (ch) {
case '(':
sum *= 2;
stack.push(ch);
break;
case '[':
sum *= 3;
stack.push(ch);
break;
case ')':
if (stack.isEmpty() || stack.pop() != '(') {
return 0;
}
if (S.charAt(i - 1) == '(')
answer += sum;
sum /= 2;
break;
case ']':
if (stack.isEmpty() || stack.pop() != '[') {
return 0;
}
if (S.charAt(i - 1) == '[')
answer += sum;
sum /= 3;
break;
}
}
if (!stack.isEmpty()) {
return 0;
}
return answer;
}
}
'알고리즘' 카테고리의 다른 글
BOJ1717 집합의 표현 java - 분리 집합 [1] (0) | 2022.01.14 |
---|---|
BOJ7490 0 만들기 java (0) | 2022.01.13 |
Baekjoon 3190 뱀 - Deque (0) | 2020.10.23 |
Baekjoon 13459 구슬 탈출 - BFS (0) | 2020.10.22 |
Baekjoon 14503 로봇 청소기 - Simulation (0) | 2020.10.21 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 디자인패턴
- BOJ
- 알고리즘
- 이팩티브 자바
- kkoon9
- Effective Java
- 정규표현식
- 클린 아키텍처
- MSA
- 이펙티브 자바
- 백준
- BAEKJOON
- JPA
- Spring
- 디자인 패턴
- Kotlin
- C++
- kotest
- AWS
- Spring Boot
- Olympiad
- Java
- programmers
- 클린 코드
- Algorithm
- 코테
- node.js
- 테라폼
- 프로그래머스
- 객체지향
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함