작성
·
247
1
선생님 죄송합니다. 링크 수정하여 다시 질문 드립니다.
저는 Input 값을 받을 때, 부모 자식에 대한 꼬리표를 같이 매겨서 부모 = 1 / 자식 = 2 / 루트 = -1 이런 식으로 풀었는데요. 75 % 쯤에서 Fail이 뜨네요 ㅠㅠ
어떤 문제가 있는 걸까요? 코드는 아래 링크에 있습니다
http://boj.kr/457d11f9ac914b61b98f62c5f2a89554
감사합니다
답변 1
0
안녕하세요 한수님 ㅎㅎ
이 문제는 노드를 지우고 >> 리프노드를 세는 건데요.
일단은 이부분.
for (int i = 0; i < n; i++) {
//-1이 아니라. 1인. 주어지는 간선을 기반으로 리프노드 카운팅하는게
// 더 나아보임. 2는 새로이 만든거니까 헷갈려요.
if ((arr[i].size() == 1) && (arr[i][0].first == 1)) cnt2++;
}
-1이 아니라 1로 하는게 맞죠. 왜냐면 2가 포함되면. 2는 한수님이 로직을 위해 만든 역방향 간선이기 때문에 해당 부분은 포함되면 안되는 것 같습니다.
저는 근데 이 로직이 이해가 안가는데요.
이로직은 지워지는 정점으로 이어지는 정점의 사이즈가 1, 그리고 루트노드가 아니라면 cnt++을 합니다.
//만약 지워지는 간선이 리프노드라면?? cnt++???
if (arr[del].size() == 1 && arr[del][0].first != -1) {
cnt++;
return;
}
저의 화가같은.. 그림입니다.하하.
그니까 한수님은 이런 로직이죠. del 타고타고 가서 저 초록색일 때 cnt++하는 거잖아요.
저걸 카운팅하고 >> 추후에 리프노드수를 세고 >> 그 수를 빼는게
어떻게 이게 지워진 정점의 리프노드의 수가 되는지 의아해서요.
cout << cnt2 - cnt;
그니까 이경우.
이경우는 리프노드라. adj[del].size == 1에 안걸릴 거같아서요.
혹시 증명 가능한가요?
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
선생님 안녕하세요.
pair <int,int> 를 사용하여 (카테고리, 노드번호) 를 아래와 같이 구현했습니다.
루트 : -1 / 부모 : 1 / 자식 : 2
(루트 / 부모 / 자식 , 노드번호)
Ex) 아래 그림에서 No. 0은 루트 노드이면서 (2,1),(2,2) 자식노드인 1 , 2 를 가지고 있다는 식으로 구현을 했는데요.
cnt2를 카운팅할 때, 리프 노드는 자식이 없고 부모 하나밖에 없다는 생각에 착안하여
size가 1인 녀석들이 리프노드라고 생각했습니다. cnt2 = 리프 노드의 총 갯수
del이 1이라고 가정을 한다면
1이 가지고 있는 (arr[del][i].first == 2) --> 자식 노드들의 값 3 / 4 를 인자값으로 넘겨주게 되면 해당 3 / 4 인 녀석들은 size가 1(리프노드) 이기 때문에 cnt++ 를 하고 리턴을 하게 됩니다. 결론 적으로 재귀함수를 다 돌게 되면 del = 1 과 연계 되는 모든 리프노드들이 계산이 되게 된다고 생각했습니다.
따라서, cnt2(리프노드 총 갯수) - cnt(del과 연계된 모든 리프노드) = 남은 리프노드
라고 생각하여 구현했는데 예외가 어떤게 있는지 잘 모르겠네요 ㅠㅠ