알고리즘 기초 - 2

Hansoo Kim·2020년 4월 20일
0
  1. max character - 주어진 string에 어떤 문자가 가장 많이 포함되어 있는지 찾는 문제.

    // --- Examples
    // maxChar("abcccccccd") === "c"
    // maxChar("apple 1231111") === "1"
    function maxChar(str) {
      const charMap = {};
      for (const char of str) {
        if (charMap[char]) {
          charMap[char]++;
        } else {
          charMap[char] = 1;
        }
      }
      let max = 0;
      let maxChar = '';
      for (const char in charMap) {
        if (charMap[char] > max) {
          max = charMap[char];
          maxChar = char;
        }
      }
      return maxChar;
    }
  2. fizzbuzz - 주어진 수를 1부터 반복하며 3과 5 또는 15로 나누어 떨어지면 각 각 fizz, buzz, fizzbuzz로 콘솔을 찍고 나머지 숫자는 그냥 콘솔로 찍는 문제

    // --- Example
    //   fizzBuzz(5);
    //   1
    //   2
    //   fizz
    //   4
    //   buzz
    function fizzBuzz(n) {
      for (let i = 1; i <= n; i++) {
        if (i % 3 === 0 && i % 5 === 0) {
          console.log('fizzbuzz');
        } else if (i % 3 === 0) {
          console.log('fizz');
        } else if (i % 5 === 0) {
          console.log('buzz');
        } else {
          console.log(i);
        }
      }
    }
  3. chunk - 주어진 배열을 주어진 수로 나누는 문제

    // --- Examples
    // chunk([1, 2, 3, 4], 2) --> [[ 1, 2], [3, 4]]
    // chunk([1, 2, 3, 4, 5], 2) --> [[ 1, 2], [3, 4], [5]]
    // chunk([1, 2, 3, 4, 5, 6, 7, 8], 3) --> [[ 1, 2, 3], [4, 5, 6], [7, 8]]
    // chunk([1, 2, 3, 4, 5], 4) --> [[ 1, 2, 3, 4], [5]]
    // chunk([1, 2, 3, 4, 5], 10) --> [[ 1, 2, 3, 4, 5]]
    function chunk1(array, size) {
      const chunked = [];
      for (const element of array) {
        const last = chunked[chunked.length - 1];
        if (!last || last.length === size) {
          chunked.push([element]);
        } else {
          last.push(element);
        }
      }
      return chunked;
    }
    function chunk2(array, size) {
      const chunked = [];
      let index = 0;
      while (index < array.length) {
        chunked.push(array.slice(index, index + size));
        index += size;
      }
      return chunked;
    }
  4. Anagram - 주어진 두개의 string이 스페이스와 punctuation(마침표 느낌표 물음표 등)을 제외하고 대소문자를 가리지 않은 채 같은 문자로 이루어진 string인가를 true/false로 리턴하는 문제.

    // --- Examples
    //   anagrams('rail safety', 'fairy tales') --> True
    //   anagrams('RAIL! SAFETY!', 'fairy tales') --> True
    //   anagrams('Hi there', 'Bye there') --> False
    function anagrams1(stringA, stringB) {
      const aCharMap = buildCharMap(stringA);
      const bCharMap = buildCharMap(stringB);
    
      if (Object.keys(aCharMap).length !== Object.keys(bCharMap).length) {
        return false;
      } else {
        for (const char in aCharMap) {
          if (aCharMap[char] !== bCharMap[char]) {
            return false;
          } else {
            return true;
          }
        }
      }
    }
    
    function buildCharMap(str) {
      const charMap = {};
      for (const char of str.replace(/[^\w]/g, '').toLowerCase()) {
        charMap[char] = charMap[char] + 1 || 1;
      }
      return charMap;
    }
    // -------------------------------------------------------
    function anagrams2(stringA, stringB) {
      return cleanString(stringA) === cleanString(stringB);
    }
    
    function cleanString(str) {
      return str.replace(/[^\w]/g, '').toLowerCase().split('').sort().join('');
    }
  5. sentence capitalization - 띄어쓰기를 기준으로 한 단어의 맨 앞 글자를 대문자로 변환하여 리턴하는 문제.

    // --- Examples
    //   capitalize('a short sentence') --> 'A Short Sentence'
    //   capitalize('a lazy fox') --> 'A Lazy Fox'
    //   capitalize('look, it is working!') --> 'Look, It Is Working!'
    function capitalize1(str) {
      const words = [];
      for (const word of str.split(' ')) {
        words.push(word[0].toUpperCase() + word.slice(1));
      }
      return words.join(' ');
    }
    
    function capitalize2(str) {
      let result = str[0].toUpperCase();
      for (let i = 1; i < str.length; i++) {
        if (str[i - 1] === ' ') {
          result += str[i].toUpperCase();
        } else {
          result += str[i];
        }
      }
      return result;
    }
  6. steps - 코드 위 코멘트 참고

    // --- Examples
    //   steps(2)
    //       '# '
    //       '##'
    //   steps(3)
    //       '#  '
    //       '## '
    //       '###'
    //   steps(4)
    //       '#   '
    //       '##  '
    //       '### '
    //       '####'
    function steps1(n) {
      for (let row = 0; row < n; row++) {
        let stair = '';
        for (let column = 0; column < n; column++) {
          if (column <= row) {
            stair += '#';
          } else {
            stair += ' ';
          }
        }
        console.log(stair);
      }
    }
    
    // recursion
    function steps2(n, row = 0, stair = '') {
      if (n === row) {
        return;
      }
      if (n === stair.length) {
        console.log(stair);
        steps(n, row + 1);
        return;
      }
      if (stair.length <= row) {
        stair += '#';
      } else {
        stair += ' ';
      }
      steps(n, row, stair);
    }
  7. pyramid

    // --- Examples
    //   pyramid(1)
    //       '#'
    //   pyramid(2)
    //       ' # '
    //       '###'
    //   pyramid(3)
    //       '  #  '
    //       ' ### '
    //       '#####'
    function pyramid1(n) {
      const midpoint = Math.floor((2 * n - 1) / 2);
      for (let row = 0; row < n; row++) {
        let level = '';
        for (let column = 0; column < 2 * n - 1; column++) {
          if (midpoint - row <= column && midpoint + row >= column) {
            level += '#';
          } else {
            level += ' ';
          }
        }
        console.log(level);
      }
    }
    // recursion
    function pyramid2(n, row = 0, level = '') {
      if (row === n) {
        return;
      }
      if (level.length === 2 * n - 1) {
        console.log(level);
        pyramid(n, row + 1);
        return;
      }
      const midpoint = Math.floor((2 * n - 1) / 2);
      if (midpoint - row <= level.length && midpoint + row >= level.length) {
        level += '#';
      } else {
        level += ' ';
      }
      pyramid(n, row, level);
    }
  8. vowels

    // --- Examples
    //   vowels('Hi There!') --> 3
    //   vowels('Why do you ask?') --> 4
    //   vowels('Why?') --> 0
    function vowels1(str) {
      let count = 0;
      const checker = 'aeiou';
      for (const char of str.toLowerCase()) {
        if (checker.includes(char)) {
          count++;
        }
      }
      return count;
    }
    // RegEx
    function vowels2(str) {
      const matches = str.match(/[aeiou]/gi);
      return matches ? matches.length : 0;
    }
  9. spiral matrix - 상당히 복잡하고 어려운 문제… 복잡 할수록 코딩보다 절차와 어떻게 동작하는지 설명하는 것이 더 중요하게 느껴진다.

    // --- Examples
    //   matrix(2)
    //     [[1, 2],
    //     [4, 3]]
    //   matrix(3)
    //     [[1, 2, 3],
    //     [8, 9, 4],
    //     [7, 6, 5]]
    //  matrix(4)
    //     [[1,   2,  3, 4],
    //     [12, 13, 14, 5],
    //     [11, 16, 15, 6],
    //     [10,  9,  8, 7]]
    function matrix(n) {
      const results = [];
      for (let i = 0; i < n; i++) {
        results.push([]);
      }
      let counter = 1;
      let startColumn = 0;
      let endColumn = n - 1;
      let startRow = 0;
      let endRow = n - 1;
      while (startColumn <= endColumn && startRow <= endRow) {
        for (let i = startColumn; i <= endColumn; i++) {
          results[startRow][i] = counter;
          counter++;
        }
        startRow++;
    
        for (let i = startRow; i <= endRow; i++) {
          results[i][endColumn] = counter;
          counter++;
        }
        endColumn--;
    
        for (let i = endColumn; i >= startColumn; i--) {
          results[endRow][i] = counter;
          counter++;
        }
        endRow--;
    
        for (let i = endRow; i >= startRow; i--) {
          results[i][startColumn] = counter;
          counter++;
        }
        startColumn++;
      }
      return results;
    }
  10. fibonacci - 피보나치 수열의 마지막 수 리턴

    // Example:
    //   fib(4) === 3
    function fib(n) {
      const result = [0, 1];
      for (let i = 2; i <= n; i++) {
        const a = result[i - 1];
        const b = result[i - 2];
    
        result.push(a + b);
      }
      return result[n];
    }
    // recursion
    function fib(n) {
      if (n < 2) {
        return n;
      }
      return fib(n - 1) + fib(n - 2);
    }
    // Memoization (caching)
    function memoize(fn) {
      const cache = {};
      return function (...args) {
        if (cache[args]) {
          return cache[args];
        }
        const result = fn.apply(this, args);
        cache[args] = result;
    
        return result;
      };
    }
    
    function fib(n) {
      if (n < 2) {
        return n;
      }
      return fib(n - 1) + fib(n - 2);
    }
    
    fib = memoize(fib);

0개의 댓글