Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

17-bomik0221 #71

Merged
merged 4 commits into from
Mar 5, 2024
Merged

17-bomik0221 #71

merged 4 commits into from
Mar 5, 2024

Conversation

bomik0221
Copy link
Member

@bomik0221 bomik0221 commented Feb 27, 2024

🔗 문제 링크

11899번: 괄호 끼워넣기
문제 유형: 스택

✔️ 소요된 시간

30분

✨ 수도 코드

문제 이해

image

사고 과정

예시를 살펴보면, ))()(( 라는 괄호열의 경우 가운데의 ()를 제외하고 4개의 괄호는 제 짝이 없는 상태이니, 괄호가 총 4개 더 있어야 완전한 괄호가 될 수 있습니다.
괄호가 완성되면 스택에서 꺼내고, 아니면 스택에 넣는 방식으로 유사한 문제를 풀었던 기억이 나서, 해당 문제에도 적용해보기로 했습니다.

수도 코드
1. 괄호 문자열을 입력받는다.
2. 괄호 문자열을 한 글자씩 떼어서, 스택에 넣는다. 괄호의 형태와 상관없이 집어넣는다.
	int 형 스택에 괄호가 '(' 이라면 1을, ')'라면 2를 넣는다.
4. 스택의 맨 위에 있는 괄호와 현재 검사중인 괄호가 짝을 이룬다면 스택 맨 위에 있는 괄호를 꺼낸다.
	이 때, 스택이 비어있지 않아야 하고, 이 경우에는 검사중인 괄호도 스택에 넣지 않는다.
5. 검사가 끝나고 나면 스택의 사이즈를 출력한다. 이는 스택에서 빠져나오지 못한, 즉 짝이 필요한 괄호의 개수와 동일하다.

초기 코드

구상은 잘 해놓고.. 뻘짓을 조금 햇습니다. 아무래도 잠 올 때는 그냥 자는 게 맞는 것 같기도.. 제 실수를 기록해두기 위해 적지만, 지금보니 조금 민망한 초기 코드입니다.

#include <iostream>
#include <stack>

int main() {
	std::string S;
	std::cin >> S;
	std::stack<int>stack;

	for (int num = 0; num < S.size(); num++) {
		if (num !=0 && S[num - 1] == '(' && S[num] == ')')	stack.pop();
		else {
			if (S[num] == '(')	stack.push(1);
			else stack.push(2);
		}
	}
	std::cout << stack.size();
	return 0;
}

처음 다 쓰고 나서 테스트해볼 때는 몇몇 케이스는 답을 출력해줘서, 자신있게 제출했는데.. 마침 제가 테스트 한 케이스가 우연찮게 저 코드로도 답을 낼 수 있는 케이스 였던 거더라구요. 이 코드에서의 제 실수는 스택의 맨 위 원소와 현재 검사중인 괄호를 비교한 것이 아니라, 냅다 문자열에서 앞 문자열과 뒷 문자열을 비교하고 있었던 것이었습니다. 그러니 )(()과 같이 맨 뒤에 괄호가 완성되어 있고, 맨 앞의 괄호는 불완전한 경우는 저 코드로도 뚝딱뚝딱 돌아갔던 것..!

최종 코드

반복문 속 조건을 약간 수정하여, 답을 맞혔습니다.

#include <iostream>
#include <stack>

int main() {
	std::string S;
	std::cin >> S;
	std::stack<int>stack;

	for (int num = 0; num < S.size(); num++) {
		//스택이 비어있지 않고, top에는 ( , 현재 검사중인 괄호는 ) 라면 stack.pop
		if (!stack.empty() && stack.top() == 1 && S[num] == ')') stack.pop();
		else {
			if (S[num] == '(')	stack.push(1);
			else stack.push(2);
		}
	}
	std::cout << stack.size();
	return 0;
}

📚 새롭게 알게된 내용

자료구조 시간에 스택 직접 구현 한 채로 스택 문제 푼 뒤로 스택문제를 처음 풀어봤습니다. 그래서 라이브러리에 있는 스택을 써본 건 오늘이 처음인데요..! 활용이 익숙지 않아 시간이 좀 더 소요된 것 같네요.

Copy link
Collaborator

@Redish03 Redish03 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다..! 마지막 2번 밖에 안남았지만....,STL에서 제공하는 스택에 적응 해보시는걸 추천드립니다 :)

사실 수업에서 배웠던 내용 거의 다 그대로 입니다 ㅋㅎㅋㅎㅋ

Copy link
Member

@miniron-v miniron-v left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다! 스택의 남은 사이즈로 정답을 구하는 부분이 참신하고 좋았어요.

비슷하지만 스택의 템플릿과, 입력을 하나씩 받는 것에 집중하면 이런 식으로 코드를 짜볼 수도 있어요.

#include <cstdio>
#include <vector>
#include <stack>
#include <string>

int main() {
	std::string str;
	char c, status;
	std::stack<char> stack;

	scanf("%1c", &c);
	while (c == '(' || c == ')') {
		if (c == ')' && stack.empty() == false && stack.top() == '(') {
			stack.pop();
		}

		else {
			stack.push(c);
		}

		scanf("%1c", &c);
	}

	printf("%d", stack.size());
}

Copy link
Collaborator

@2secondag 2secondag left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

자료구조에서 풀었던 문제....!!!! 오랜만에 보니 반갑네요
라이브러리를 쓰니 훨씬 간결해지는....

2secondag

This comment was marked as off-topic.

@bomik0221 bomik0221 merged commit 82668dc into main Mar 5, 2024
@bomik0221 bomik0221 deleted the 17-bomik0221 branch March 5, 2024 13:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants