Algorithm

LEETCODE 872. Leaf-Similar Trees

KANG_G1 2024. 8. 8. 20:10

Tree 문제에 약하기도 하고 경험이 없어 쉬운 난이도부터

풀이를 진행했어요.

 

문제 자체는 쉬웠지만 다른 분들의 코드를 보며 새로 배운 개념이 있어

포스팅하게 되었습니다.


문제 접근

 

root의 left와 right가 존재하지 않는 요소가 마지막 node이므로

마지막 node라면 배열에 추가를 해준 후, root1의 node를 담는 배열과

root2의 node를 담는 배열을 비교하면 될 것으로 예상되었습니다.


나의 풀이 & 다른 풀이

 

첫 풀이

 

각 결과를 담는 배열들을 문자열로

형변환을 통해 비교를 했는데요.

 

순서가 다를 시에도 true 값으로 결과가 발생하는 케이스가 존재해

테스트 케이스에서 실패했습니다.

var leafSimilar = function(root1, root2) {
    const arr1 = [], arr2 = [];

    const searchTree = (root, array) => {
        if (!root) return;

        if (!root.left && !root.right) array.push(root.val);

        searchTree(root.left, array);
        searchTree(root.right, array);
    }

    searchTree(root1, arr1);
    searchTree(root2, arr2);

    return arr1.join('') === arr2.join('');
};

 

두 번째 풀이

 

배열을 형변환 하는 것이 아닌,

root1과 root2의 배열을 순회하며 비교해

모든 요소가 일치하면 true를 return 하는

every 메서드를 사용 해결할 수 있었습니다.

var leafSimilar = function(root1, root2) {
    
const arr1=[],arr2=[];

const searchTree = (root,array) => {
    if(!root) return;

    if(!root.left && !root.right) array.push(root.val);

    searchTree(root.left,array);
    searchTree(root.right,array);
}

searchTree(root1,arr1);
searchTree(root2,arr2);

const isSameLeaf = (array1,array2) => {
if(array1.length !== array2.length) return false;
   return array1.every((leaf,index)=> leaf === array2[index]);
}

return isSameLeaf(arr1,arr2);
};

 

 

다른 풀이

 

제가 every 메서드의 idx로 배열의 순서를 보장해 값을 비교했다면

toString 메서드와 JSON.strigify 메서드를 사용하는 방법도 존재했습니다.

 

// JSON.stringify

JSON.stringify([1,2,3]) === JSON.stringify([1,2,3]); // true


// toString
const arr1 = [1, 2, 3];
const arr2 = [1, 2, 3];

array1.toString() === array2.toString(); // true

 

하지만 toString과 JSON.stringify의 차이점이 존재했는데요.

toString은 중첩 배열이나 객체를 포함한 배열을 비교할 수 없다는 점이었습니다.

const arr1 = [32, { name: 'kang' }];
const arr2 = [32, { name: 'kang' }];

array1.toString() === array2.toString(); // false
JSON.stringify(array1) === JSON.stringify(array2); // true