[리트코드] 234. Palindrome Linked List

Chaejung·2022년 8월 2일
0

알고리즘_JavaScript

목록 보기
2/12

문제

주어진 링크드 리스트가 회문인지 판별하는 문제이다.

무작정 head.length를 쓰려니 undefined가 나와서 당황했는데, 당연함.
array가 아니라 말그대로 링크드 리스트가 들어왔기 때문이다.

그래서 링크드 리스트를 array로 바꿔주고 시작했다.

Python이었으면 왼쪽, 오른쪽 반씩 슬라이싱하고 equal check를 하는 게 한 줄 정도면 끝났겠지만 JavaScript로는? 어림도 없다. 일일이 다 해줘야 함.

해설 코드

var isPalindrome = function(head) {
  	// array로 바꿔주기 위해 전체 크기 구하기
    function nodeNumber(node){
        if (node.next === null){
            return 0
        }
        let countNode = 1
        while (node.next) {
            node = node.next
            countNode += 1
        }
        return countNode
    }
    listLength = nodeNumber(head)
    nodeToArray = []
    let currentNode = head
    // 링크드 리스트 nodeToArray에 넣어주기
    for (let i=0;i<listLength;i++){
        nodeToArray.push(currentNode.val)
        currentNode = currentNode.next
    }
    // 홀짝에 따라 반으로 나눠주고 뒤집어 주기
    let mid = listLength%2 == 0 ? listLength/2 : Math.floor(listLength/2)
    const left = nodeToArray.slice(0, mid)
    const right = listLength%2 == 0 ? nodeToArray.slice(mid, listLength).reverse() :nodeToArray.slice(mid+1, listLength).reverse()
   /* example
   [1, 2, 2, 1] -> [1, 2], [1, 2]
   [1, 2, 3, 2, 1] -> [1, 2], [1, 2]
   [1, 2, 3, 3, 2] -> [1, 2], [2, 3]
   */
    // ⭐️⭐️서로 같은 array인지 판별하기⭐️⭐️
    function arrayEquals(a, b) {
        return Array.isArray(a) &&
            Array.isArray(b) &&
            a.length === b.length &&
            a.every((val, index) => val === b[index]);
    }
    
    return arrayEquals(left, right)
};

결과

기억해야할 것

  • JavaScrip에서 동일한 Array인지 판별하기
    절대로 냅다 a === b로 판별하면 안된다!!
    얕은 복사로 만든 게 아닌 이상 요소가 같아도 false가 나온다.
    function arrayEquals(a, b) {
        return Array.isArray(a) &&
            Array.isArray(b) &&
            a.length === b.length &&
            a.every((val, index) => val === b[index]);
    }
profile
프론트엔드 기술 학습 및 공유를 활발하게 하기 위해 노력합니다.

0개의 댓글