hot1614   3년 전

코드 블록이 통과한 코드입니다. 

캡쳐 이미지가 제가 처음에 풀고 제출했던 코드인데 시간초과가 떠서요. 재귀 호출의 시간복잡도를 아직 이해를 잘 못한거 같은데 검색해도 이해하기가 힘듭니다 ㅠㅠ 혹시 두 코드의 시간 복잡도 차이를 설명해줄수 있을까요??

preview

tor012   3년 전

사진의 소스는 다음과 같은 상태공간트리를 가지게 됩니다.

preview

게시해 주신 소스는 다음과 같은 상태공간 트리를 가지게 됩니다.

preview

n이 3일때의 기준으로 diff()의 호출횟수가

전자는 192회 후자는 8회입니다.

n이 20에 달하는 경우 후자는 105만번정도의 diff 호출만 일어나지만

전자의경우는 셀수도없을정도로 많은 호출이 일어나곘죠.


전자의 재귀함수가 만드는 visit의 경우는 문제에서 필요한 것 보다 너무많은 중복의 경우를 만들고 있습니다. (재귀의 파라미터가 의미를 가지지 못하고, 의미없는 반복문이 호출되기 때문입니다)

후자의 경우는 나이브하게 생각할수 있는 팀의 조합을 딱 맞게 구하긴 하지만(그리고 시간제한 내에도 돌만하게 만들긴 하지만)

정답을 구할 수 있는 조합보다는 2배 많은 조합을 만들게 됩니다.

후자의 경우 정답을 2배만든다고 하는 이유에 대해선 다음 예를 들어볼 수 있습니다.

A, B, C 세 사람이 있습니다.

start팀에 A만

link팀에 B,C 가 들어갔을때의 시너지 차이와

start팀에 B,C가

link팀에 A만 들어갔을때의 시너지 차이가 과연 다를까요? 두 경우를 다 따져야만 정답을 알 수 있을까요?

tor012   3년 전

사진의 53번줄 if문을 확인하지못해 실제 호출횟수는 n=3일때 192보다는 작을듯합니다만 여전히 말도안되게 불필요한 경우를 많이 만드는것은 변함없습니다.

hot1614   3년 전

제대로 이해했습니다. 감사합니다. 그림 까지 그려주셔서 확실히 이해됐습니다!! 감사합니다 ㅠㅠㅠ

댓글을 작성하려면 로그인해야 합니다.