일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 프로그래머스
- 개발일지
- 기업분석
- 온라인쇼핑
- 백준 2252 자바
- 인사관리사이트
- 1062번 가르침
- 백준 1700 자바
- Spring Security
- 라이브커머스
- 백준 멀티탭스케줄링 자바
- 조인종류
- 데이터베이스 기초지식
- 팀프로젝트
- 2504 괄호의값 자바
- 이커머스
- 줄세우기 위상정렬
- 백준 1806 자바
- 유니온 파인드
- 자바 2869
- 백준 최소비용구하기 자바
- 다익스트라 최소비용구하기
- 자바 1193
- 커머스기사
- 웹 기술면접
- 괄호의값 스택
- 백준 줄세우기 자바
- 백준 괄호의값 자바
- Union Find
- 백준 1193
Archives
- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 프로그래머스
- 개발일지
- 기업분석
- 온라인쇼핑
- 백준 2252 자바
- 인사관리사이트
- 1062번 가르침
- 백준 1700 자바
- Spring Security
- 라이브커머스
- 백준 멀티탭스케줄링 자바
- 조인종류
- 데이터베이스 기초지식
- 팀프로젝트
- 2504 괄호의값 자바
- 이커머스
- 줄세우기 위상정렬
- 백준 1806 자바
- 유니온 파인드
- 자바 2869
- 백준 최소비용구하기 자바
- 다익스트라 최소비용구하기
- 자바 1193
- 커머스기사
- 웹 기술면접
- 괄호의값 스택
- 백준 줄세우기 자바
- 백준 괄호의값 자바
- Union Find
- 백준 1193
Archives
- Today
- Total
JumpUp
백준 [N2504 - 괄호의값] 본문
풀이과정
스택응용문제이다. 스택을 사용해 올바른 괄호열인지 확인하는 것은 알았지만, 괄호값을 계산하는 것을 어떻게 구현할지 풀지 못했다. 이는 분배법칙을 생각하면 풀 수 있던 문제였다.
입출력 예제로보면,
(()[[]])는 다음과 같이 계산된다. 2*(2+3*3). 이를 분배법칙으로 풀어보면 2*2+2*3*3이 된다.
(연산을 위한 val변수, 연산결과를 나타내는 result변수 선언 후)
열린 괄호가 나오면 무조건 val * (2 or 3) 괄호종류에 따라 곱해주도록 한다.
닫힌 괄호가 나오면,
(올바르지 않은 괄호열인 경우)
스택이 비어있거나 peek()값이 괄호의 짝이 아닌 경우 올바른 괄호열이 아니기에 result = 0으로 하고 넘어간다.
(올바른 괄호열인 경우)
바로 직전 인덱스에 그 괄호의 짝이 있다면, result이 이제까지 연산해온 val값을 더해준다.
stack에서 pop해주고, 무조건 곱해온 val/(2 or 3) 괄호종류에 따라 나눠준다.
( | ( | ) | [ | [ | ] | ] | ) | 계산 | |
val *= 2 | val =2 | ||||||||
val *= 2 | val =4 | ||||||||
val /=2 | result = 4 val =2 |
2*2 | |||||||
val *= 3 | val = 6 | ||||||||
val *=3 | val = 18 | ||||||||
val /=3 | result = 22 val = 6 |
2*2+ 2*3*3 |
|||||||
val /= 3 | val = 2 | ||||||||
val /=2 | val = 1 |
소스코드
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
int val = 1;
int result = 0;
Stack<Character> stack = new Stack<>();
for(int i=0;i<str.length();i++){
char x = str.charAt(i);
if(x=='(' || x=='['){
stack.push(x);
val*= (x=='(')?2:3;
}else if(x==')'){
if(stack.isEmpty() || stack.peek()!='(') {//올바르지 않은 괄호열
result =0;
break;
}
//올바른 괄호열
if(i-1>0 && str.charAt(i-1)=='(') result+=val;//바로직전에 괄호짝이 있는 경우
stack.pop();
val/=2;
}else{
if(stack.isEmpty() || stack.peek()!='[') {//올바르지 않은 괄호열
result =0;
break;
}
//올바른 괄호열
if(i-1>0 && str.charAt(i-1)=='[') result+=val;//바로직전에 괄호짝이 있는 경우
stack.pop();
val/=3;
}
}
if(!stack.isEmpty()) result = 0;
System.out.println(result);
}
728x90
'알고리즘' 카테고리의 다른 글
백준 [N1700 - 멀티탭스케줄링] (0) | 2021.12.27 |
---|---|
백준 [N1062 - 가르침] (0) | 2021.12.21 |
백준 [N14888 - 연산자끼워넣기] (0) | 2021.12.04 |
프로그래머스 [여행경로] (0) | 2021.11.20 |
백준 [N1697 - 숨바꼭질] (0) | 2021.11.17 |