JavaScript - LeetCode Random Algorithm Test(5)

먹보·2023년 3월 6일
0

1. Merge Two Sorted Lists (No.0021)

문제 설명

You are given the heads of two sorted linked lists list1 and list2.
Merge the two lists in a one sorted list. The list should be made by splicing together the nodes of the first two lists.
Return the head of the merged linked list.

해석

2개의 정렬된 Linked List (list1,list2)의 헤드가 주어졌을 때, 두 개의 Linked List를 하나의 정렬된 Linked List로 합치는 코드를 구현해주세요

예제

코드

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
var mergeTwoLists = function(list1, list2) {
    let mergedHead = new ListNode();
    let current = mergedHead;

    while (list1 !== null && list2 !== null) {
        if (list1.val < list2.val) {
            current.next = list1;
            list1 = list1.next;
        } else {
            current.next = list2;
            list2 = list2.next;
        }
        current = current.next;
    }

    current.next = (list1 === null) ? list2 : list1;

    return mergedHead.next;
};

🗒️코멘트

확실히 LeetCode의 문제가 Programmers 보다 좋다고 느낀 점이 바로 자료구조와 알고리즘을 직접적으로 다뤄볼 수 있는 문제가 많다. 프로그래머스의 레벨2 영역까지 도달하면서 Linked List를 직접적으로 다뤄본 적이 없었는데 오늘 다뤄보면서 감을 약간 잡은 것 같다.

하나 주의해야 할 점은..자바스크립트 상에서 Linked List가 Array로 보이기 때문에 배열 접근 방식으로 문제를 풀려고 했었던 점이다. 주어진 function의 Definition을 확인 후 차근 차근 풀어나가면 어떤 식으로 접근 할 수 있는지 파악 할 수 있다.


2. A Number After a Double Reversal (No.2219)

문제 설명

Given an integer num, reverse num to get reversed1, then reverse reversed1 to get reversed2. Return true if reversed2 equals num. Otherwise return false.

해석

정수 num이 주어졌을 때, 이 정수를 2번 뒤집었을 때 만약 원래 주어진 num과 같다면 true를 다르다면 false를 리턴하는 함수를 구현하세요.

예제

코드

//내 코드
var isSameAfterReversals = function(num) {
  return reverseNumber(reverseNumber(num)) === num ? true : false
};

function reverseNumber(n) {
  let reversed = 0;
  while (n > 0) {
    const digit = n % 10;
    reversed = reversed * 10 + digit;
    n = Math.floor(n / 10);
  }
  return reversed;
}

// 다른 사람의 풀이
var isSameAfterReversals = function (num) {
  return num == 0 || num % 10 != 0;
};

🗒️코멘트

우선 본래 예전의 나였더라면 풀이법은 단순하다.

String(num).split("").reverse().join("")

위의 방식을 사용해서 숫자를 두 번 뒤집는 것이다.

물론 쉬운 문제지만 이번에는 접근을 조금 더 수학적으로 해보기로 마음을 먹고 각 각의 자릿수를 10으로 나눈 나머지를 생각해보았는데...

제출을 하고 다른 사람들의 답안을 보다보니 머리를 한 대 맞은 느낌이 들었다.

너무나 당연한 것을 하나의 방법에 몰두하여 잊고 있었다니..일반화를 하면 편할 것을..너무 구체적으로 파고드는 것이 정석일 수도 있겠으나 개발자라면 일반화 시키는 것이 가능하다면 그렇게 가는 것으로 방향을 잡고 생각해봐야 한다.


3. Minimum Difference Between Highest and Lowest of K Scores (No.1984)

문제 설명

You are given a 0-indexed integer array nums, where nums[i] represents the score of the ith student. You are also given an integer k.
Pick the scores of any k students from the array so that the difference between the highest and the lowest of the k scores is minimized.
Return the minimum possible difference.

해석

숫자로 이루어진 배열 nums[i]과 정수 k가 주어지고 배열의 각 숫자는 i번째 학생의 점수를 가리킬 때, k명의 학생 중에서 가장 큰 숫자와 가장 작은 숫자의 차이 중 가장 적은 차를 구하는 함수를 구현해주세요.

예제

코드

function minimumDifference(nums, k) {
  nums.sort((a, b) => a - b);
  let minDiff = Infinity;
  for (let i = 0; i <= nums.length - k; i++) {
    let diff = nums[i + k - 1] - nums[i];
    if (diff < minDiff) {
      minDiff = diff;
    }
  }
  return minDiff;
}

🗒️코멘트

profile
🍖먹은 만큼 성장하는 개발자👩‍💻

0개의 댓글