[binarysearch] 37, 39, 43, 56, 57 (Easy)

황은하·2021년 11월 24일
0

알고리즘

목록 보기
98/100
post-thumbnail

37. Unidirectional Word Search

왼쪽에서 오른쪽으로, 위에서 아래로 탐색하면서 word가 존재하는지 찾는 문제.
word의 첫 문자를 찾았을 때 그 위치부터 왼->오, 위->아래 로 탐색을 진행했다.

class Solution {
    solve(board, word) {
        if (!board || !word) return false;

        for (let i = 0; i < board.length; i++) {
            for (let j = 0; j < board[0].length; j++) {
                if (board[i][j] === word[0]) {
                    if (word.length === 1) return true;
                    if (this.searchHo(i, j, board, word) || this.searchVer(i, j, board, word)) return true;
                }
            }
        }
        return false;
    }

    searchHo(i, j, board, word) {
        let idx = 1;
        let k = j + 1;
        while (k < board[0].length && idx < word.length) {
            if (board[i][k] !== word[idx]) break;
            if (idx === word.length - 1) return true;
            idx++;
            k++;
        }
    }

    searchVer(i, j, board, word) {
        let idx = 1;
        let k = i + 1;
        while (k < board.length && idx < word.length) {
            if (board[k][j] !== word[idx]) break;
            if (idx === word.length - 1) return true;
            idx++;
            k++;
        }
    }
}


39. Length of a Linked List

연결리스트의 길이를 구하는 문제.
while 반복을 사용하여 노드의 다음을 타고 가면서 개수를 셌다.

/**
 * class LLNode {
 *   constructor(val, next=null) {
 *     this.val = val
 *     this.next = next
 *   }
 * }
 */
class Solution {
    solve(node) {
        let length = 0;
        let curNode = node;
        while (curNode !== null) {
            length++;
            curNode = curNode.next;
        }
        return length;
    }
}


43. Rotate List Left by K

k개의 요소를 뒤로 이동시키는 문제.
k = 3 => [1,2,3,4,5,6] -> [4,5,6,1,2,3]

  • 내가 푼 방법
class Solution {
    solve(nums, k) {
        if (nums.length == k) return nums;
        let newNums = nums.slice(k);
        for (let i = 0; i < k; i++)
            newNums.push(nums[i]);

        return newNums;
    }
}

k부터 끝까지 배열을 잘라서 그 뒤에 0~k-1까지 배열을 잘라서 붙였다.

  • 다른 사람이 푼 방법
class Solution {
    solve(nums, k) {
        if (nums.length == k) return nums;
        return nums.slice(k).concat(nums.slice(0, k))
    }
}


56. Nth Fibonacci Number

n번째 피보나치를 구하는 문제.
피보나치 값들을 배열에 저장하여 현재 값을 구할 때, 이전의 두 수를 더해서 구한 뒤 배열에 넣었다.
인덱스가 0부터 시작하므로 n-1 위치의 값을 반환했다.

class Solution {
    solve(n) {
        if (n === 0 || n === 1) return 1;
        const fibo = [1, 1];
        for (let i = 2; i <= n; i++) {
            fibo.push(fibo[i - 2] + fibo[i - 1]);
        }
        return fibo[n - 1];
    }
}


57. Wolf of Wall Street

최저점에서 구입하여 최고점에서 팔 때 가장 큰 수익을 반환하는 문제.
Two Pointer 사용.

class Solution {
    solve(prices) {
        if (prices.length === 0 || prices.length === 1) return 0;

        let gap = 0;
        let min = 0, max = 0;

        while (min < prices.length && max < prices.length && min <= max) {
            if (prices[min] < prices[max])
                gap = Math.max(gap, prices[max] - prices[min]);
            else min = max;
            max++;
        }

        return gap;
    }
}
profile
차근차근 하나씩

0개의 댓글