이전에 알고리즘 문제 풀이를 했었던 것 중에 이진 탐색 트리에 관련한 문제가 있었다. 문제를 풀기 위해서 스스로 정보를 찾아보며 개념을 정리하고, 유튜브 강의를 검색하기도 하였다. 다만, 현재까지 짧은 기간 공부를 해본 경험으로써는 한 번 열심히 공부하고 정리를 한다고 절대로 그 지식이 내 것이 되지 않는다.
물론 이는 개인적인 경험이며, 다소 부족한 나의 지능의 문제일 수 있다. 어쨌든 스스로 내린 이를 해결할 수 있는 방법의 결론은 반복해서 많이 접해봐야 한다는 것이다. 적어도 나는 한 번 본다고 해서 절대 그 지식이 온전히 내 것이 되지 않기에 모른다고 하더라도 해당 개념과 비슷한 알고리즘 문제를 여러 번 접해야한다는 결론에 이르렀다.
그리고 단순히 대단히 좋은 스킬을 가진 강사가 가르친다 하더라도 그것은 그의 지식과 강의 스킬이 잠시 나의 것인양 착각하는 마법에 빠질 뿐, 이 또한 마찬가지로 나의 지식이 아니라는 것이다.
내가 이렇게 주절주절 떠드는 이유는 이전 알고리즘 문제에서 언급했다시피 Leetcode의 알고리즘 문제를 접할 때마다 며칠 전에 풀었던 문제들과 달리 손도 못대는 문제들이 많아졌기 때문이다. 이건 단순히 자료구조에 대한 지식의 부족도 있지만, 경험의 부족도 한 몫을 하고 있으리라 생각한다.
그러므로 이제부터는 예를 들어 이진 트리라고 하면, Leetcode에서 이에 관련한 알고리즘 문제들을 계속 풀어보는 것이 좋을 것 같다. 오랜 기간이 지난 고3의 악몽같던 추억을 떠올리며 반복 학습의 중요성에 대해 떠올리게 되었다.
그래서 한동안은 이진 트리에 관련한 알고리즘 문제를 찾아서 풀어보려한다.
1 2 3 4 5 6 7 8 9 10 11 12 | const mergeTrees = (root1, root2) => { if (!root1) { return root2; } if (!root2) { return root1; } root1.val += root2.val; root1.left = mergeTrees(root1.left, root2.left); root1.right = mergeTrees(root1.right, root2.right); return root1; }; | cs |
일단 이 문제도 혼자의 힘으로 풀지는 못했다. 코드를 보고 이해하는 방식으로 진행하려 한다. 먼저 해당 이진 트리는 레벨 순회 방식으로 횡단을 한다. 현재까지 알고 있던 3가지의 순회 방식은 3가지였는데 여기에 레벨 순회 방식이 있다는 것을 처음 알게 된 사실!
이렇게 순회 방식은 알게 되었고 먼저 두 개의 트리 노드가 null 값인지를 먼저 확인해주는 과정이 필요하다. 그렇지 않다면(null이 아니라면), 값을 update하게 된다.
그리고 각각 왼쪽과 오른쪽 서브 트리에 재귀 함수를 할당해주게 된다. 이렇게 코드는 쉽게 작성할 수 있다. 그러나 이러한 과정에 대한 사고 방식이 아직은 많이 부족하기 때문에 이진 트리에 대한 정의를 공부하면서 반복적으로 문제를 풀이하는 방법으로 공부를 하려 한다. 화이팅!! 💪💪💪