JavaScript - LeetCode Random Algorithm Test(6)

먹보·2023년 3월 8일
0

1. Remove Duplicates from Sorted List (No.0083)

문제 설명

Given the head of a sorted linked list, delete all duplicates such that each element appears only once. Return the linked list sorted as well.

해석

졍렬된 연결 리스트의 헤드가 주어졌을 때, 반복된 노드들을 모두 지운 연결리스트를 반환하는 함수를 구현해주세요.

예제

코드

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var deleteDuplicates = function(head) {
  let current = head;
  while(current.next !== null){
    if(current.val === current.next.val){
      current.next = current.next.next; 
    }
    else {
      current = current.next;
    }  
  }
  return head;
};

🗒️코멘트

난이도가 쉬움인데도 불구하고 아직 자료구조를 다루는 것이 익숙하지가 않다.

그래도 Visual Go라는 싱가폴 국립 대학교에서 만든 자료구조 관련 웹사이트에서 영감을 받아 작성해 보았다.

연결리스트는 배열과는 다르게 직접적으로 접근할 수 있는 방법이 없다보니 while loop을 쓰면서 순회해야 하는 것이 조금 번거롭지만 그래도 시간 복잡도는 O(n)이 걸리기에 도찐개찐인 것 같고 처음에는 Set을 이용한 접근해보려고 했으나 Visual Go에서는 단순히 다음 노드에 다다음 노드를 할당해버리는 것으로 자르는 것을 보고 그것을 활용하였다.


2. Check if Matrix Is X-Matrix (No.2319)

문제 설명

A square matrix is said to be an X-Matrix if both of the following conditions hold:

  1. All the elements in the diagonals of the matrix are non-zero.
  2. All other elements are 0.

Given a 2D integer array grid of size n x n representing a square matrix, return true if grid is an X-Matrix. Otherwise, return false.

해석

정사각형 구조의 매트릭스가 주어졌을 때, 그 매트릭스가 x-matrix이지 확인하는 함수를 구현해주세요.

매트릭스의 대각선에 있는 요소들이 전부 0이 아닌 숫자들이고 그 외의 요소들이 모두 0일 경우 이를 x-matrix라고 한다.

예제

코드

var checkXMatrix = function(grid) {
    for (let i = 0; i < grid.length; i++) {
        if (grid[i][i] === 0 || grid[i][grid[i].length - i - 1] === 0) {
            return false;
        }
        for (let j = 0; j < grid[i].length; j++) {
            if (grid[i][j] !== 0 && j !== i && j !== (grid[i].length - i - 1)) {
                return false;
            }
        }
    }
    return true;
};

🗒️코멘트

좀 많이 아쉬운 문제다.

이중 for문을 사용하지 않고 푸는 방법을 머리속에서 아무리 굴려봐도..떠오르지 않는다.

그리고 for문을 이용해서 푸는 데도 시간이 많이 걸렸다.

단순히 문제가 어려워서가 아니라 for문을 안쓰고 풀어야지 라는 생각에 사로잡혀 머릿속이 멈춰버렸다.

우선은 문제를 풀고 리팩토링은 나중에 하는 것으로 방향성을 잡아야겠다.


3. Island Perimeter (No.0463)

문제 설명

You are given row x col grid representing a map where grid[i][j] = 1 represents land and grid[i][j] = 0 represents water.
Grid cells are connected horizontally/vertically (not diagonally). The grid is completely surrounded by water, and there is exactly one island (i.e., one or more connected land cells).
The island doesn't have "lakes", meaning the water inside isn't connected to the water around the island. One cell is a square with side length 1. The grid is rectangular, width and height don't exceed 100. Determine the perimeter of the island.

해석

그리드로 나타낸 i * j 사이즈의 지도가 2차원의 배열로 주어지고, 특정 장소 (grid[i][j])에 땅이 있다면 1, 땅이 없다면 0으로 마크되어 있습니다. 각 각의 그리드가 길이가 1인 선분으로 둘러쌓여 있을 때, 섬의 둘레의 길이를 구하는 함수를 구현해주세요.

예제

코드

var islandPerimeter = function(grid) {
  let answer = 0;
  for (let i = 0; i < grid.length; i++) {
    for (let j = 0; j < grid[i].length; j++) {
      if (grid[i][j] === 1) {
        answer += 4;
        if (i > 0 && grid[i-1][j] == 1) answer--;
        if (j > 0 && grid[i][j-1] == 1) answer--;
        if (j < grid[i].length-1 && grid[i][j+1] == 1) answer--;
        if (i < grid.length-1 && grid[i+1][j] == 1) answer--;
      }
    }
  }
  return answer;
};

🗒️코멘트

이번에도 역시 이중 for문을 사용해서 구현했다. 땅의 둘레를 구할 때 겹치는 부분의 둘레는 세지 않으므로 위,아래,그리고 양 옆을 확인하는 분기를 두었으며, 주변에 그리드가 없을 경우를 생각해서 제약 조건을 하나씩 더 걸어두었다.

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

0개의 댓글