강의

멘토링

커뮤니티

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

박완섭님의 프로필 이미지
박완섭

작성한 질문수

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

1068 트리 질문입니다.

작성

·

239

0

1. 맞은 코드: http://boj.kr/bfc24b98d15d4e65bce9cb7271137df7

2. 틀린 코드: http://boj.kr/a89e7e90e442422fb1569d22bb593ff7

 

두 코드를 짤 때 1번 코드의 경우 루트 위에 더미를 하나 넣어서 코드를 짯고..

2번 코드는 루트 노드에 대한 예외처리를 해준 코드인데

2번 코드와 1번 코드가 별로 다른 점이 없는데 2번 코드에서만 틀린 판정을 받는 이유가 궁금합니다!

답변 2

0

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

아 저렇게 해서 간선이 없냐, 있냐 구현하신건 아는데요. 저렇게 하는게 좀 쎄해서요. 어떤 느낌이냐면

저렇게 해서 지워버리면 정작 지워야 하는 노드를 안지우고 그 밑에 있는 간선을 지우는 셈이잖아요.

image1번의 경우를 보면 원래 저 정점을 지우게 되면 왼쪽에 있는 노드만이 리프노드가 되어서 cnt = 1이 되잖아요. 근데 그 밑에 간선만 지워버리게 되면 리프노드가 2개가 되어서 cnt = 2가 되는데 해당 부분이 고려된 코드일까 하는것이죠. ㅎ

아 그리고 언제든지 질문주세요. ㅎㅎ

감사합니다.

박완섭님의 프로필 이미지
박완섭
질문자

아 구현이 m[del]에서 del로 가는 간선을 지우는거고, m자체가 키가 자식, 벨류가 부모라서

지워야 하는 노드의 부모로부터 자식으로 가는 간선을 지운겁니다!

1번코드의 경우 로직은 거의 똑같이 구현했는데 정답 처리를 받았고,

2번 코드의 경우 예시 입력은 모두 출력이 정상적으로 나왔는데 최종적으로 오답 처리가 나와 질문 드린겁니다

박완섭님의 프로필 이미지
박완섭
질문자

그리고 문제에 대한 질문 외에 좀 상담이 필요한 부분인데..

사실 대부분의 문제 접근할 때 제가 생각한 로직도 문제를 풀 순 있지만, 큰돌님의 접근법이 좀 더 추상화가 잘 되있고 코드 자체가 심플하잖아요? 그러다보니 제 코드에서 오류가 발생할 여지가 많은데..

근데 제가 계속 제 코드에 대한 반례를 찾는 걸 여쭤보는게.. 제 사고과정에 어딘가 문제가 있는것인가.. 해서 걱정돼서 하긴 하는데.. 시간도 많이 잡아먹고 큰돌님에게 과외를 받는것도 아니라 시간도 많이 잡아먹다보니 과연 8주는 커녕.. 4개월 안에나 가능할 지 의문이 들더라구요.

근데 또 제 코드 베이스를 싹 걷어내고 큰돌님 코드를 고대로 필사하자니 제가 실제 시험을 풀 때 과연 큰돌님의 방식대로 접근할 수 있을까? 라고 스스로 물었을 때 모든 문제를 100프로 큰돌님처럼 접근할 순 없고 제가 생각하는 방식대로 접근하는 문제들이 실제 시험환경에선 생길텐데 이런 맞왜틀이 실제 기업 입사 테스트에서도 생길까 걱정입니다.

어쩔 수 없이 시간이 해결해 줄 문제일까요? 아니면 조금 내려놓고 큰돌님 코드를 필사하는데 집중해야 할까요?

박완섭님의 프로필 이미지
박완섭
질문자

아 반례 찾았습니다.

루트가 0번이고 1번 노드의 부모가 0번일 때 1번을 지워버리게 되면 정답이 하나로 나와야 하는데

맞은 코드는 더미노드를 줘서 문제가 맞았고.. 틀린 코드는 위의 케이스를 고려 못했습니다.

답변 주셔서 감사합니다.

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

근데 제가 계속 제 코드에 대한 반례를 찾는 걸 여쭤보는게.. 제 사고과정에 어딘가 문제가 있는것인가..

>> 문제 없습니다. 지금 저 코드도 나름 괜찮아요. 잘하고 계십니다.

근데 또 제 코드 베이스를 싹 걷어내고 큰돌님 코드를 고대로 필사하자니 제가 실제 시험을 풀 때 과연 큰돌님의 방식대로 접근할 수 있을까?

>> 일단 완섭님스타일 >> 질문생기면 >> 질문 >> 그 이후 제코드 필사 이런식으로 하면 2가지 방법으로 모두 공부하게 되서 "다양한 방법"으로 문제를 푸실 수 있게 됩니다. 맞왜틀은 그리고 문제를 푸시다보면 실력이 늘게 되면서 줄어들게 되니 걱정하지 마세요.

감사합니다.

0

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

음 저 질문이 있는데요.

arr[m[del]][del] = 0;

이거요. 이걸로 지울 수 있나요?

그니까 이거는 지우는 노드가 아니라 그 아랫부분을 지우는 코드 아닌가요?

image

박완섭님의 프로필 이미지
박완섭
질문자

아 m이 맵이고 각 노드를 키로, 각 노드의 부모를 값으로 가지고 있도록 구현했습니다.

따라서 arr[m[del]][del]을 하게 되면

2차원 배열에 0이면 간선이 없고, 1이면 간선이 있도록 구현해서..

arr[del의 부모][del 본인]을 향한 간선을 지우게 돼서 방문을 안하도록 구현하였습니다.

1번 코드와 2번 코드가 로직은 거의 동일한데, 2번 코드만 오답판정을 받은 반례를 못찾고 있습니다.

매번 귀찮은 질문 답변 주셔서 감사합니다. (_ _)

박완섭님의 프로필 이미지
박완섭

작성한 질문수

질문하기