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 |
29 | 30 |
Tags
- 골드3
- dp
- Framework
- SW역량평가
- 코딩테스트
- backend
- 백엔드
- 그래프
- Floyd
- 백준
- SW역량테스트
- BFS
- 최단경로
- 골드5
- 완전탐색
- 스프링
- professional
- 순열
- 최소신장트리
- 최단경로탐색
- D4
- 알고리즘
- 트리의지름
- java
- 중복순열
- BOJ
- swea
- 실버1
- 1251
- Spring
Archives
- Today
- Total
공부 기록장
[백준-2504] 괄호의 값 본문
이 문제는 백준 실버 2 레벨의 문제이다.
이 문제는 실버 2임에도 불구하고 뭔가 생각해야 할 것도 많고 되게 까다로웠다.
처음에는 식을 어떻게 세워야 할 지 몰라서 헤매고 있었는데 스터디 같이 하던 오빠가 어떤식으로 풀면 되는지 알려주었다.
1) (나 [와 같은 열리는 괄호가 나오면 스택에 넣어주기
2) 닫히는 괄호가 나왔을 때 스택 제일 위에 있는 것이 짝이 맞는 열리는 괄호라면 2 혹은 3 으로 바꿔주기
3) 열리는 괄호가 아니라면 스택을 검사하며 열리는 괄호가 나올 때 까지 값을 더해주거나 곱해주기.
4) 단, 짝이 맞지 않는 열리는 괄호가 나오면 올바르지 않은 문장이기 때문에 종료.
이게 가장 큰 틀이다.
import java.util.Scanner;
import java.util.Stack;
public class 괄호의값_2504 {
static String s;
static Stack<String> stack;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
stack = new Stack<>();
s = sc.next();
boolean flag = true;
for(int i = 0; i < s.length(); i++) {
String c = s.substring(i, i+1);
if(c.equals("(") || c.equals("[")) //열리는 괄호 삽입
stack.push(c);
else if(!stack.isEmpty()){ //스택이 비어있지 않다면
if(c.equals(")")) { // ) 가 나왔을 때
if(stack.peek().equals("(")) { //바로 앞이 ( 였다면
stack.pop();
stack.push("2"); //그 자리를 2로 바꿔줌
}else {
int sum = 0;
while(!stack.isEmpty()){ //loop 검사
String check = stack.pop();
if(check.equals("(")) { //스택을 돌다가 ) 부분을 만나면
sum *= 2; //지금까지 더해준 숫자에 2를 곱해준 뒤 넣어주기
stack.push(Integer.toString(sum));
break;
}else if(check.equals("[")){ // [를 만나면 잘못된 수식.
flag = false;
break;
}else { //숫자를 만났다면 같은 괄호 속에 들어있는 것이므로 계속해서 더해주기.
sum += Integer.parseInt(check);
}
}
}
}else { //[의 경우도 (와 똑같이 계산.
if(stack.peek().equals("[")) {
stack.pop();
stack.push("3");
}else {
int sum = 0;
while(!stack.isEmpty()){
String check = stack.pop();
if(check.equals("[")) {
sum *= 3;
stack.push(Integer.toString(sum));
break;
}else if(check.equals("(")){
flag = false;
break;
}else {
sum += Integer.parseInt(check);
}
}
}
}
}else { //스택이 비어있는데 열리는 괄호가 아니면 끝.
flag = false;
break;
}
}
int ans = 0;
while(!stack.isEmpty()){
String check = stack.pop();
if(check.equals("(") || check.equals("[")){
flag = false;
break;
}
ans += Integer.parseInt(check);
}
if(flag) {
System.out.println(ans);
}else {
System.out.println(0);
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준-1806] 부분합 (0) | 2021.05.11 |
---|---|
[백준-1916] 최소비용 구하기 (0) | 2021.05.03 |
[백준-1062] 가르침 (0) | 2021.04.29 |
[백준-14719] 빗물 (0) | 2021.04.28 |
[백준-14888] 연산자 끼워넣기 (0) | 2021.04.28 |
Comments