자료구조/문제풀이
[백준 JAVA] 2504 괄호의 값
휴먼코딩
2024. 7. 17. 20:59
2504 괄호의 값
https://www.acmicpc.net/problem/2504
문제설명
Stack을 사용한 괄호열 값 계산
접근방식
O(n) 선형 시간복잡도
문자열을 한 번 순회하며 입력받은 문자 만큼 스택에 넣고 빼는 연산을 수행한다.
문제 조건 분석 과정
- 1. 입력받은 괄호열을 Stack<Character>을 사용하여 짝을 맞춘다.2. 문자열을 순회하면서
- 각 문자((, ), [, ])에 값을 대입한다.
- (가 들어오면 스택에 저장하고, tmp에 2를 곱한다
- [가 들어오면 스택에 저장하고, tmp에 3을 곱한다.
- )가 들어오면 스택이 비어있거나 스택의 맨 위가 (가 아니면 false로 처리한다.
- 이전에 (가 있었다면 그에 해당하는 값(tmp)을 answer에 더하고, tmp를 나눈다.
- ]가 들어오면 스택이 비어있거나 스택의 맨 위가 (가 아니면 false로 처리한다.
- 이전에 [가 있었다면 그에 해당하는 값(tmp)을 answer에 더하고, tmp를 나눈다.
- 곱셈 결과를 담은 answer을 출력한다.
사용된 자료구조
- Stack: 스택을 사용하여 괄호의 짝을 맞추고, 각 괄호열의 값을 계산한다.
전체코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine().trim(); // 괄호열 입력 받기
Stack<Character> stack = new Stack<>(); // 괄호를 저장할 스택
int answer = 0; // 괄호열의 값 저장할 변수
int tmp = 1; // 현재 괄호열의 값을 저장할 변수
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (ch == '(') {
stack.push(ch); // '(' 괄호 스택에 저장
tmp *= 2; // '(' 괄호의 값은 2
} else if (ch == '[') {
stack.push(ch); // '[' 괄호 스택에 저장
tmp *= 3; // '[' 괄호의 값은 3
} else if (ch == ')') {
if (stack.isEmpty() || stack.peek() != '(') { // 올바르지 않은 괄호열인 경우
answer = 0;
break;
}
if (i > 0 && input.charAt(i - 1) == '(') { // '()' 괄호열의 값 처리
answer += tmp;
}
stack.pop(); // '(' 괄호 처리
tmp /= 2;
} else if (ch == ']') {
if (stack.isEmpty() || stack.peek() != '[') { // 올바르지 않은 괄호열인 경우
answer = 0;
break;
}
if (i > 0 && input.charAt(i - 1) == '[') { // '[]' 괄호열의 값 처리
answer += tmp;
}
stack.pop(); // '[' 괄호 처리
tmp /= 3;
}
}
if (!stack.isEmpty()) { // 스택에 남아있는 괄호가 있는 경우
answer = 0;
}
System.out.println(answer); // 결과 출력
br.close();
}
}