[바킹독의 실전 알고리즘] 0x08 - 스택의 활용(수식의 괄호 쌍)

오젼·2023년 8월 14일
0

강의

https://www.youtube.com/watch?v=cdjjk-ryPKc

문제 해결 방법

  1. 여는 괄호가 나오면 스택에 추가
  2. 닫는 괄호가 나왔을 경우,
    2-1. 스택이 비어있으면 올바르지 않은 괄호 쌍
    2-2. 스택의 top이 짝이 맞지 않는 괄호일 경우 올바르지 않은 괄호 쌍
    2-3. 스택의 top이 짝이 맞는 괄호일 경우 pop
  3. 모든 과정을 끝낸 후 스택에 괄호가 남아있으면 올바르지 않은 괄호 쌍, 남아있지 않으면 올바른 괄호 쌍

문제

https://github.com/encrypted-def/basic-algo-lecture/blob/master/workbook/0x08.md

4949

STL 스택 이용해서 간단하게 풀 수 있는 문제

3986

진짜 간단한 문제 스택에 A, B를 쌓아가는데 넣을 때 top이 같은 문자면 pop 시킴. 마지막에 스택이 empty여야 좋은 단어

9012

간단한 괄호쌍 문제

10799

스택으로 풀지 않아도 됐던 문제.😲

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

	string str;

	cin >> str;
	int cnt = 0;
	int res = 0;

	for (int i = 0; i < str.length(); ++i) {
		if (str[i] == '(') {
			++cnt;
		} else if (str[i] == ')') {
			--cnt;
			if (str[i - 1] == '(') {
				res += cnt;
			} else {
				++res;
			}
		}
	}

	cout << res;
}

어떻게 풀었었더라.. 아 사진을 보면 ( 하나당 막대의 나눠진 부분 하나가 된다는 것을 알 수 있음. 그래서 ++cnt를 하다가

)를 만나면 레이저거나 막대가 끝난다는 뜻이기 때문에 --cnt를 해줌

이 때 이전 문자가 (면 레이저이기 때문에 해당 레이저를 기준으로 나눠진 왼쪽 막대들의 합인 cntres에 더해줌

이전 문자가 (가 아니라면 그건 막대가 끝나는 부분을 뜻함. 막대가 나눠진 부분 중 끄트머리만 안 더해진 상태이므로 ++res를 해줌

2504

오오 골드 첨 맞춰봐~~
답안에 비하니까 난 살짝 더 복잡하게 풀긴 했다.
어쨌든 핵심은 여는 괄호면 multi를 계속 곱해가다가 여는괄호+닫는괄호 조합이 나오면 곱해왔던 multi를 res에 더해주는데 이 때 div로 나눠주고 더해줌.

div는 괄호쌍이 pop될 때마다 곱해줌.

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

	string str;

	cin >> str;

	int multi = 1, div = 1, res = 0;
	bool close = false;
	stack<char> s;

	for (auto c : str) {
		if (c == '(' || c == '[') {
			if (close) {
				res += multi;
				multi /= div;
				div = 1;
			}
			c == '(' ? multi *= 2 : multi *= 3;
			close = false;
			s.push(c);
		} else {
			if (s.empty()) {
				res = 0;
				multi = 0;
				break;
			}
			close = true;

			if (c == ')' && s.top() == '(') {
				div *= 2;
				s.pop();
			} else if (c == ']' && s.top() == '[') {
				div *= 3;
				s.pop();
			} else {
				res = 0;
				multi = 0;
				break;
			}
		}
	}

	res += multi;

	if (!s.empty()) res = 0;
	cout << res;
}

1개의 댓글

comment-user-thumbnail
2023년 8월 14일

유익한 글이었습니다.

답글 달기