CS/Algorithm 문제

[Baekjoon]백준 2504번 괄호의 값

백준 2504번 괄호의 값

 

문제: https://www.acmicpc.net/problem/2504

 

내코드

 

- A(B+C) = A*B + A*C 를 활용

- 변수 mul에 곱해야 하는 값을 저장해두고 (가 추가되면 *2, [가 추가되면 *3을 해줌

- ), ]가 나오면 두가지로 나눠서 생각

- 앞에가 (,[이면 바로 숫자로 바꿔서 mul값을 곱해준후 pop, 그 후 위에서 곱해준 2, 3의 값을 나눠준후 다시 밑에서 () = 2, [] = 3 값을 곱해줘야하니 별다른 처리 안하고 sum += mul;

- 앞에가 (,[이 아니면 error체크만 해준뒤 pop해준 후 mul값을 2,3으로 다시 나눠줌.

- 만약 스택이 비어있으면 괄호가 닫힐수가 없으므로 error

- input 값에서 i가 ), ]일때 i-1번째 값이 (,[일수 있고 ),]일수 있으니까 한번에 mul /= 2해주기

- 마지막에 스택이 비어있지 않으면 error, 비어있으면 sum 값 출력.

 

#include <iostream>
#include <string>
#include <stack>

using namespace std;

stack<char> stk;
int sum = 0;//result
int mul = 1;

int main(void)
{
	ios::sync_with_stdio(false);
	cin.tie(0);

	string input;
	cin >> input;
	int length = input.length();
	for (int i = 0; i < length; i++) {
		if (input[i] == '(') {
			mul *= 2;
			stk.push('(');
		}
		else if (input[i] == '[') {
			mul *= 3;
			stk.push('[');
		}
		else if (input[i] == ')') {
			if (input[i - 1] == '(') {
				sum += mul;
			}
			if (stk.empty()) return !printf("0");
			if (stk.top() == '(') stk.pop();
			mul /= 2;
		}
		else if (input[i] == ']') {
			if (input[i - 1] == '[') {
				sum += mul;
			}
			if (stk.empty()) return !printf("0");
			if (stk.top() == '[') stk.pop();
			mul /= 3;
		}
	}
	
	//if not empty return 0
	cout << (stk.empty() ? sum : 0);
	
	return 0;
}

 

참고

https://blockdmask.tistory.com/362

http://choonslife.blogspot.com/2018/07/2504.html

http://wookje.dance/2018/01/25/boj-2504-%EA%B4%84%ED%98%B8%EC%9D%98-%EA%B0%92/

 

 

 

728x90
반응형

'CS > Algorithm 문제' 카테고리의 다른 글

[BaekJoon] 백준 1926번 그림  (0) 2020.02.21
[BaekJoon]백준 2493번 탑  (0) 2020.01.28
[BaekJoon] 백준 10799번 쇠막대기  (0) 2019.12.12
[BaekJoon]백준 9012번 괄호  (0) 2019.12.03
[BaekJoon]백준 5430번 AC - C++, Python  (0) 2019.12.03