인프런 커뮤니티 질문&답변

l1IlIl1님의 프로필 이미지
l1IlIl1

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

1-M 질문

해결된 질문

작성

·

268

·

수정됨

1

if(stk.size()&&stk.top()==a)

부분이 이해가 안가는데

cin에 ABBABBAA를 입력하면 범위기반 for문을 통해 a가 ABBABBAA가 되어야한다고 생각하고

stk.top()도 가장 마지막걸 참조하는거니까 제일 나중에 입력된 A가 참조되어야 한다고 생각하는데

왜 cout으로 찍어봤을때 B가 나오는지 이해를 못하겠습니다..

if(stk.size()&&stk.top()==a)

이게 스택의 사이즈가 존재하면서 가장 마지막 스택이 a와 일치한다 라는건 알겠는데

막상 찍어보면 왜 저런 결과가 나오는지도 모르겠습니다..

강의도 돌려보고 교안도 계속보면서 cout 위치 바꿔가면서 찍어보는데 모르겠습니다..

 


수정) for문이 끝나는게 아니고 중괄호로 if랑 이어져서

알파벳 하나씩 독립적으로 적용해야 하는 사실을 깨달았습니다.

그러면 차근차근 쌓이면서 붕괴된다는것을 이해했습니다.

그러면 로직의 가장 처음에 A가 먼저 쌓일테니까 stk.top()이 A이고

a는 ABBABBAA에서 가장 처음에 A를 데려오니까 붕괴된다라고 이해하기엔

또 cout으로 B가 제일 먼저 찍히는데 진짜 이해를 못하겠습니다

그냥 단순하게 B가 있는 상황에서 B가 들어오면 붕괴되는거 이해했는데

이걸 코드로 바꾸면 왜 stk.top()==a인지 잘 모르겠어요..

그걸 코드로 바꿨을때 a의 입장이 어떻게 변하는지 모르겠습니다

a의 입장에서 로직이 어떻게 진행되는지 알려주세요 ㅠㅠ

 

 


수정) 처음에 size가 0이니까 A가 1층에 push되고

A가 top인 상황에서 B가 입력되는데 A랑 B랑 다르니까 그 다음 B가 push되고

이제 B가 top인 상태에서 B가 들어오려고 하는데 여기서 top==a가 되면서

소거 되는게 맞나요?

답변 1

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 ㅎㅎ

A가 top인 상황에서 B가 입력되는데 A랑 B랑 다르니까 그 다음 B가 push되고 이제 B가 top인 상태에서 B가 들어오려고 하는데 여기서 top==a가 되면서

>> 네 맞습니다.

그리고 제가 디버깅 코드를 작성해봤는데요. 참고해주세요.

#include<bits/stdc++.h> 
using namespace std;  
int n, ret; 
string s; 
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n; 
	for(int i = 0; i < n; i++){
		cin >> s; 
		stack<char> stk;
		for(char a : s){
			if(stk.size() && stk.top() == a)stk.pop();
			else stk.push(a); 
			cout << "드가자\n";
			cout << a << " : " << stk.size() << '\n';
			if(stk.size()) cout << stk.top() << '\n';
		} 
		if(stk.size() == 0)ret++;
	}
	cout << ret << "\n"; 
}
/*
드가자
A : 1
A
드가자
B : 2
B
드가자
B : 1
A
드가자
A : 0
드가자
B : 1
B
드가자
B : 0
드가자
A : 1
A
드가자
A : 0
1
*/

또한, 앞으로 질문 올리실 때 해당 문제 강의에 링크해서 올려주세요.

해당 강의 옆에 질문하기로요.ㅎㅎ

또 질문 있으시면 언제든지 질문 부탁드립니다.

감사합니다.

강사 큰돌 올림.

 

l1IlIl1님의 프로필 이미지
l1IlIl1

작성한 질문수

질문하기