MY MEMO

[문제해결기법] Ordered Tree 완성하기 본문

ALGORITHM/문제해결기법

[문제해결기법] Ordered Tree 완성하기

l_j_yeon 2017. 5. 22. 14:38




어떻게 풀면 시간을 최대한 빨리 풀수 있을 까 생각했다.


일단 DP로 풀었다.


그리고 grouping을 한다고 생각했다. (각각의 노드가 다른 것이 아니므로)


먼저 노드의 개수가 정해진 것들은 main_tree를 돌렸다


몇개의 그룹을 생성해야하는지 그리고 얼마나 많은 node를 넣을 것인지 그리고 현재의 그룹의 개수는 몇개인지를 돌려보는 함수이다.


몇개의 그룹을 생성해야할까?

바로 윗단계의 노드의 수를 보면 된다.


얼마나 많은 노드를 넣어야할까?

먼저 0부터 시작했다 한개도 넣지 않는 그룹도 있으므로


현재의 그룹개수는 몇개일까?

for문안에서 한 그룹의 노드를 index만큼 빼간다 그럼 이후 다음 그룹으로 넘어가기때문에 for문 안에서 함수를 다시 돌때마다 group을 1씩 더해줘야한다


그렇다면 result가 몇인지 나온다 이는 곱해줘야 한다 왜냐하면 


한 레벨마다의 경우의 수이기 때문에 1레벨에서 2가지 2레벨에서 2가지면 총 만들 수 있는 트리의 모양은 4가지이다.


main_tree 함수의 전체적인 흐름은 아래와 같다.


먼저 한개도 넣지 않는다 그렇게 지어야할 그룹의 개수(이하 group_count)가 초과 될때까지 돈다 


초과되면 0을 return


이후 한개를 넣어본다 만약 총 노드의 수가 2개라면 (그룹을 지어야할 노드의 수 이하 node_count)


아직 아니다 return 0 (나머지 노드 수 (이하 remain_node) 가 0이 아닌데 이미 그룹을 다 지어버렸으면)


이후 2개를 넣어본다 


remain_node가 0이고 그룹을 모두 지었다 즉 return 1을 한다


그럼 2개를 모두 넣어보앗으면 이전 그룹으로 돌아간다


아까 이전 그룹에서 한개도 안 넣어보았으니까 이제 1을 넣어본다


그리고 다음그룹으로 넘어온다


다음그룹에서 한개도 안넣어보면 당연 remain_node가 1이기 때문에 return 0


이와 같은 형식으로 반복한다.




cache

y를 지어야 할 총 그룹의 수 x를 총 노드의 수라고 가정해보자


1개의 그룹을 지어야 할때 총 노드가 1개라면 

위 사진 중 2번째 경우에서 2번째에 해당한다고 할 수있다.

즉 이미 이전 노드에서 1개를 썼고 그러므로 현재 노드는 1개 그리고 우리가 채워야하는 나머지 그룹도 1개 이므로


1개의 그룹을 지어야할때 총 노드가 2개라면 

첫번째 경우에 해당한다고 할 수 있다

이미 전 그룹에서는 1개의 노드도 사용하지 않았으므로 2개의 노드가 남았고 남은 그룹의 개수는 1개이므로 

여기서 나온 결과값이 저장된다.



그렇다면 나머지 노드로 마음대로 트리를 생성해야하는데 이것은 어떻게 할 수 있을 까?


cache를 사용하기로 결정했다.


즉 남은 노드는 단지 레벨당 노드의 수만 정해져있지않을뿐이다


따라서 개수만 정해주기만 하면 main_tree함수를 이용해서 결과값을 구할 수 있다.


무조건 레벨당 1개의 노드는 있어야 하므로 index는 1부터 시작한다


1개씩 배분하며 main_tree를 돌려 값을 곱한다.


만약 모든 노드를 사용하였다면 1가지의 경우의수가 나왔다 sum에 더해주자


다시 돌려본다 이번엔 마지막 노드를 1개 더 주자


이렇게 계속 sub_tree를 돌린다


마지막으로 main_tree와 sub_tree에서 나온 값을 곱해주면 답이 나온다.


Comments