일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 |
Tags
- 정수론
- 수학
- 자료 구조
- 재귀
- 프로젝트
- dfs
- Vue
- 정보처리기사
- 백트래킹
- 백준
- 그래프 이론
- 다이나믹 프로그래밍
- 너비 우선 탐색
- 그래프 탐색
- JPA
- 알고리즘
- 소수 판정
- 브루트포스 알고리즘
- Spring Security
- 문자열
- n과 m
- 스택
- 프로그래머스
- springboot
- DB
- 깊이 우선 탐색
- MYSQL
- 배포
- SWEA
- 구현
Archives
- Today
- Total
영원히 남는 기록, 재밌게 쓰자
백준 [2504] 괄호의 값 (JAVA) 본문
728x90
반응형
문제
풀이
분배 법칙 힌트를 얻고 풀어보려 했지만 내가 닫는 괄호가 여러 개 나올 때에 처리가 애매하여 풀이를 참고했다.
- 여는 괄호에 대해서는 괄호열 값에 따라 바로 곱셈 법칙을 적용하여 tmp값에 저장한다.
- 처음 닫는 괄호열이 나왔을 때
- 스택이 비어있거나 peek 값이 여는 괄호가 아니라면 올바른 괄호열이 아님.
- 바로 이전의 값(입력받은 괄호열 중 이전의 값. 스택에 있는 값이 아니다.)이 여는 괄호라면 현재까지 tmp에 저장한 값을 ans 변수에 더해준다. (이 값이 분배 법칙에 의해 계산된 값이 된다.)
- 스택에서 값을 빼고 곱한 괄호열 값을 나눠서 원복 시킨다.
- () 괄호열과 [] 괄호열 동일하게 적용해준다.
- 올바른 괄호열이 아니거나 스택에 괄호열이 남아있으면 0을 출력, 그렇지 않으면 결과 값(ans)을 출력
정답코드
package com.baekjoon.data_structure.p2504;
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 brackets = br.readLine();
Stack<Character> stk = new Stack<>();
int res = 0;
int tmp = 1;
boolean isCorrect = true;
for (int i = 0; i < brackets.length(); i++) {
char now = brackets.charAt(i);
if (now == '(') {
stk.push(now);
tmp *= 2;
} else if (now == '[') {
stk.push(now);
tmp *= 3;
} else {
if (now == ')') {
if (stk.isEmpty() || stk.peek() != '(') {
isCorrect = false;
break;
}
/*
* 여기 부분을 이해하지 못함.
* 열린 괄호까지 계속해서 연산을 해준다음 처음 만나는 여는 괄호가 올바르면
* 그 때까지의 연산을 더해주면 그 이후 닫는 괄호에 대해서는
* 스택의 여는 괄호를 빼주고 분배법칙 연산한 값을 원복 시키는 역할을 해야한다.
* [] 괄호 역시 똑같이 적용
*/
if (brackets.charAt(i - 1) == '(') {
res += tmp;
}
stk.pop();
tmp /= 2;
} else if (now == ']') {
if (stk.isEmpty() || stk.peek() != '[') {
isCorrect = false;
break;
}
if (brackets.charAt(i - 1) == '[') {
res += tmp;
}
stk.pop();
tmp /= 3;
}
}
}
if (!isCorrect || !stk.isEmpty()) {
System.out.println(0);
} else {
System.out.println(res);
}
}
}
728x90
반응형
'Algorithm > 백준' 카테고리의 다른 글
백준 [7662] 이중 우선순위 큐 (JAVA) (0) | 2024.07.18 |
---|---|
백준 [1976] 여행가자 (JAVA) (0) | 2024.07.12 |
백준 [17413] 단어 뒤집기 2 (JAVA) (0) | 2024.07.10 |
백준 [1918] 후위 표기식 (JAVA) (0) | 2024.07.10 |
백준 [9935] 문자열 폭발 (JAVA) (0) | 2024.07.10 |