250x250
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
- 백준13458
- 23288
- 코테
- java
- 완전탐색
- 파티션 크기 조정
- 자바
- 삼성역테
- N과M
- 중복순열
- 정보처리기사
- 볼륨 만들기
- 전화번호속의암호
- 에라토스테네스의채
- 알고리즘개념
- D드라이브생성
- 중복조합
- 백준
- 자바 코테
- 백준15652
- 재귀함수
- 코테준비
- 알고리즘
- 완탐
- 정올 1620
- BFS
- 순열
- 주사위굴리기2
- 백준2251
- Bfs와DFS
Archives
- Today
- Total
뚱땅뚱땅
[문제] 백준 2504번 괄호의 값 본문
728x90
내 풀이
예시 문제를 직접 연산식으로 나타내면 아래와 같다.
연산식을 분배하면 2*2 + 2*3*3 + 2*3 이 되는데, 이 때 더해지는 시점을 보면
화살표로 표시한, 열고 닫는 괄호가 바로 나오는 때라는 걸 알 수 있다.
2*2 + 2*3*3 + 2*3
빨간 부분은 화살표 시점의 괄호 값이다.
그리고 그 앞에 누적되서 곱해진 것은 해당 괄호쌍 앞에 누적된 열린 괄호만큼이다.
따라서, 이 논리로 아래 코드와 같이 스택으로 구현하면 답을 구할 수 있다..
public class BOJ_2504 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String s = in.readLine(); //괄호열
Stack<Character> stack = new Stack<>(); //여는 괄호 담을 스택
int res = 0; //결과값 저장
int plus = 1; // 계속해서 결과값에 더해질 변수 (누적곱)
boolean isRight = true; // 올바른 괄호열인지 판단
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// 스택 비었는데 닫힌 괄호 들어오면 잘못된 괄호열
if (stack.isEmpty()) {
if (c == ')' || c == ']') {
isRight = false;
break;
}
}
// 여는 괄호열 => push. 괄호에 해당하는 숫자를 plus숫자에 곱해준다.
if (c == '(') {
stack.push(c);
plus *= 2;
} else if (c == '[') {
stack.push(c);
plus *= 3;
}
// 짝이 맞는 괄호가 스택에 있을 때
else if (c == ')' && stack.peek() == '(') {
// () 가 나왔을 떄 결과값에 더해준다.
if (s.charAt(i - 1) == '(') {
res += plus;
}
//짝이 맞으니 하나 pop
stack.pop();
// 더해줄 변수에 자기만큼 나눠줌
plus /= 2;
} else if (c == ']' && stack.peek() == '[') {
if (s.charAt(i - 1) == '[') {
res += plus;
}
stack.pop();
plus /= 3;
}
// 나머지 경우 -> 올바르지 않은 괄호열
else {
isRight = false;
break;
}
}
//올바르지 않은 괄호열 == 스택에 괄호가 남아있거나 위에서 isRight가 false가 된 경우
if (!stack.isEmpty() || !isRight)
res = 0;
System.out.println(res);
}
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[문제] 백준 17406번 배열 돌리기 4 (0) | 2021.02.11 |
---|---|
[문제] 백준 12789번 도키도키 간식드리미 (0) | 2021.02.11 |
[문제] 백준 7569번 토마토 (0) | 2021.02.11 |
[문제] 백준 7576번 토마토 (0) | 2021.02.11 |
[문제] 백준 1966번 프린터 큐 (0) | 2021.02.11 |
Comments