https://www.acmicpc.net/problem/2504
📝문제
📝풀이
괄호 짝이 맞는 지 검사하는 작업에 더해서 괄호에 따른 연산을 추가로 하는 문제이다.
1. 열린 괄호인 경우 :
- stack 에 push 한 뒤 임시 변수에 곱 연산을 한다.
2. 닫힌 괄호인 경우 :
2.1 이전 괄호가 짝이 맞는 열린 괄호인 경우
- 더 이상 곱 연산이 적용 되지 않는 원소이므로 최종 결과 값에 더해준다
2.2 stack의 맨 위 원소와 짝이 맞지 않거나 stack 이 비어 있는 경우
- 잘못된 괄호이므로 break
- stack 에서 pop 한 뒤 괄호에 맞는 값을 임시 변수에 나누기 연산을 한다.
- 루프를 다 돌 동안에 stack 이 비어 있지 않으면 짝이 맞지 않으므로 break
import static java.util.Arrays.*;
import java.io.*;
import java.util.ArrayList;
import java.util.Stack;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
ArrayList<String> words = stream(br.readLine().split(""))
.collect(Collectors.toCollection(ArrayList::new));
int answer = 0;
Stack<String> stack = new Stack<>();
String prev = "";
int cur = 1; // 1에서 부터 시작
loop:
for (String word : words) {
switch (word) {
case "(" -> { // 열리는 괄호 일때
cur *= 2;
stack.push(word);
}
case "[" -> {
cur *= 3;
stack.push(word);
}
case ")" -> { // 닫히는 괄호 일때
if (stack.isEmpty() || !stack.peek().equals("(")) { // 잘못 된 괄호이면 break
answer = 0;
break loop;
} else if (prev.equals("(")) // 중간 정산
answer += cur;
stack.pop();
cur /= 2;
}
case "]" -> {
if (stack.isEmpty() || !stack.peek().equals("[")) {
answer = 0;
break loop;
} else if (prev.equals("["))
answer += cur;
stack.pop();
cur /= 3;
}
}
prev = word; // 중간 정산을 위한 이전 값 기록
}
if(!stack.isEmpty()) // 괄호짝이 남는 경우 => 잘못된 괄호
answer = 0;
System.out.println(answer);
}
}
'알고리즘,PS > 백준' 카테고리의 다른 글
[BOJ] 백준 [16198] 에너지 모으기JAVA (0) | 2022.04.27 |
---|---|
[BOJ] 백준 [1406] 에디터 JAVA (0) | 2022.04.26 |
[BOJ] 백준 [18111] 마인크래프트 JAVA (0) | 2022.04.20 |
[BOJ] 백준 [1107] 리모컨 JAVA (0) | 2022.04.15 |
[BOJ] 백준 [14500] 테트로미노 JAVA (0) | 2022.04.14 |