선생님 2-R 문제 질문드립니다.
349
작성한 질문수 2
선생님 안녕하세요.
이번에 2-R 문제를 푸는데 예제와 제가 만든 예제들도 다 통과하는데 결과는 78% 정도에서 계속 실패가 뜨는데 왜 그런지 잘 모르겠습니다.. ㅜㅜ
우선 제가 푼 방식은 삭제 노드부터 시작해 그 밑의 모든 자식 노드들에 -1을 넣어. 최후에는 size==0인 노드의 갯수를 세주는 방식으로 풀었습니다. 또한 루트 로드만 남았을 경우에는 그 루트노드가 리프노드임을 감안하여 코드를 작성했습니다. 혹시 어떤 부분이 틀렸는지 봐주실 수 있나요?
#include <bits/stdc++.h>
using namespace std;
vector<int> v[52];
int N,n,num,cnt,r,temp;
void dfs(int a){
while(v[a].size()>0){
temp=v[a][v[a].size()-1];
v[a].pop_back();
dfs(temp);
}
v[a].push_back(-1);
return ;
}
int main(){
cin.tie(NULL);
cin>>N;
for(int i=0;i<N;i++){
cin>>n;
if(n==-1) r=i;
else v[n].push_back(i);
}
cin>>num;
if(num==r){
cout<<0<<"\n";
return 0;
}
else{
dfs(num);
for(int i=0;i<N;i++){
if(v[i].size()==0) cnt+=1;
}
cout<<cnt<<"\n";
}
return 0;
}
답변 3
0
음.. 지금 보면 로직이 "혼동"이 됩니다. 자, grade님께서 말씀하신건 - 1과 제거를 같이 한다는 건데 굳이 그럴 필요가 없죠.
제거면 제거 -1이면 -1 두가지 중에 한가지만 하셔도 될 거같아요.
예를 들어 제거같은 경우는 이렇게 하면 되겠죠?
void dfs(int here){
if(adj[here].size() == 0) return;
for(int there : adj[here]){
dfs(there);
}
while(adj[here].size()){
adj[here].pop_back();
}
}
감사합니다.
0
아. 제가 푼 방식은 while 문을 통해 a의 노드의 자식노드를 뒤에서부터 하나씩 탐색해주어 탐색한 자식 노드들은 .pop_back() 해주어 v[a] 사이즈를 줄여준 다음에 v[a].size()가 0이 될 시 -1값을 추가해주어 v[a].size() 가 0이 안되게 하여 size가 0인 노드들의 갯수를 검색해주는 것입니다.
예를 들어, 사이트 예제 2에서
v[0]={1,2}, v[1]={3,4}, v[2]={}, v[3]={}, v[4]={}
이므로 dfs(1)을 할 시 v[1][1]인 4를 통해 v[4]를 dfs 진행해 주고 size가 0이므로 -1을 추가해줍니다. 그리고 v[1]에서 pop_back을 통해 size를 줄입니다.
다음에는 v[1][0]인 3을 통해 v[3]을 dfs 진행해 주고 v[3]의 size가 0이므로 마찬가지로 -1을 추가해주고, v[1]에서 pop_back을 통해 size를 줄여줍니다.
이렇게 2번 진행해준 결과 v[1]의 size가 0이 되므로 v[1]에도 마찬가지로 -1을 .push_back을 해줍니다.
이 결과 v[0]={1,2}, v[1]={-1}, v[2]={}, v[3]={-1}, v[4]={-1} 이 되어 size가 0인 갯수를 세주면 1이 되므로 답이 1이 되는 과정입니다.
최대한 제가 생각한걸 표현해봤는데 맞는지 모르겠네요.. ㅜㅜ
0
안녕하세요. ㅎㅎ
void dfs(int a){
while(v[a].size()>0){
temp=v[a][v[a].size()-1];
v[a].pop_back();
dfs(temp);
}
v[a].push_back(-1);
return ;
}
이코드가 이해가 안되는데요. 좀 더 설명해주실 수 있으실까요?
예를 들어 while문을 통해 계속해서 갱신되는 v[a].size()
를 통해 지우고 싶다면 a를 변경시켜야 하는데 그런 것도 없어서요.
1-E질문입니다!
0
515
2
3-L 틀린 부분 피드백 부탁드립니다.
0
815
2
1-A문제 순열재귀함수 질문입니다.
0
380
1
1-A 일곱난쟁이문제입니다
0
454
1
문제 풀 때 방향성에 대해
0
796
1
맥에서 vs code로 실행 관련 질문입니다
0
520
1
17071번 메모리 초과
0
384
1
1-C질문입니다!
0
417
2
2-B BFS 시간초과질문
0
628
2
1-O 13번 라인
0
437
1
6-J 놀이공원 문제 질문
0
379
1
구현관련 질문
0
481
1
강의 교안
0
316
1
실력을 더 올리고나서 강의를 보는 것이 맞을까요?
0
544
1
안녕하세요! 재귀함수에 관해서 질문드립니다
0
534
1
1-K
0
471
2
3-G번 질문있습니다.
1
469
3
3-C 실행 시간 질문드립니다.
0
491
1
4-A 문제 풀이 질문있습니다.
0
589
2
비트마스킹 연산자 "1의 보수" 영문 표기법
0
433
1
격자탐색 문제에서 BFS 시간복잡도 질문드립니다.
0
332
1
3-O go 함수 질문 드립니다.
1
442
2
4-A 출력 질문
0
301
1
1주차 1-O 질문드립니다
0
253
1





