Javascript 기본 알고리즘 정리

nona·2021년 1월 20일
0

Javascript

목록 보기
1/1

참고

  • .split() 는 array 를 리턴한다.

fizzbuzz

3의 배수에는 fizz를 return, 5의배수에는 buzz를 리턴, 3과 5가 둘다 들어있으면 fizzbuzz리턴.

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);
    }
  }
}

Chunk

  • 문제예시
// 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], 10) --> [[ 1, 2, 3, 4, 5]]

solution 1
for of loop 이용

function chunk(array, size) {
  const chunked = [];

  for (let element of array) {
    const last = chunked[chunked.length -1];

    if (!last || last.length === size) {
      chunked.push([element]);
    } else {
      last.push(element);
    }
  }

  return chunked;
}

solution 2
.slice method이용
.slice(0, 2)는 어레이의 index 0부터 2전까지 = 첫번째와 두번째 index만 리턴. .slice(1)은 1부터 끝까지 다 리턴.

function chunk(array, size) {
  const chunked = [];
  let index = 0;

  while (index < array.length) {
    chuncked.push(array.slice(index, index + size));
    index += size;
  }

  return chunked;
}

reverse string

solution 1
새로운 for of loop (ES2015, string이나 array에 사용)를 사용한 reverse
:go through each character of 'str', one by one. and set the each character equal to 'character'(which is the temporary variable)


function reverse(str)
  let reversed = '';

  for (let character of str) {
      reversed = character + reversed;
  }
// example. str='apple'
// reversed = a     //a
// reversed = p + a     //pa
// reversed = p + pa     //ppa
// reversed = l + ppa     //lppa
// reversed = e + lppa     //elppa

  return reversed;
}

solution 2
reduce method를 사용한 reverse
:reduce method take first argument '', and pass it into the arrow function. whatever gets returned from that inner function will be then used as the starting argument(which is 'rev') for every run.


function reverse(str) {
  return str.split('').reduce((rev, char) => char + rev
  , '');
}

reverse integer

solution 1
.toString()을 이용해서 string으로 바꾼다음 split, reverse, join사용한다음 parseInt()를 사용하여 다시 숫자로 바꿔준다.

function reverseInt(n) {
  const reversed = n
  .toString()
  .split('')
  .reverse()
  .join('');

 if (n<0) {
  return parseInt(reversed) * -1;
}
  return parseInt(reversed)
}

solution 2
if statement를 Math.sign() 으로 대체

function reverseInt(n) {
  const reversed = n
  .toString()
  .split('')
  .reverse()
  .join('');

  return parseInt(reversed) * Math.sign(n);
}

solution 3

function reverseInt(n) {
    const splited = n.toString().split('');
    let reversed = '';
    for(let character of splited) {
        reversed = character + reversed;
    }
    return parseInt(reversed) * Math.sign(n);
}

palindrome

palindrome이 맞는지 확인하고, boolean 타입으로 리턴하기

function palindrome(str) {
  const reversed = str.split('').reverse().join('');

  return str === reversed;
}

anagrams

  • 문제예시
//   anagrams('rail safety', 'fairy tales') --> True
//   anagrams('RAIL! SAFETY!', 'fairy tales') --> True
//   anagrams('Hi there', 'Bye there') --> False

solution 1

sudo code
딱 character들만 매칭되게 하기 위해 regex로 스페이스와 !를 지워주고, lower case로 바꿔준다.
word.replace(/[^\w]g,"").toLowerCase();

object의 key들만 빼는 방법:
const obj = {a: 1, b: 1, c: 1};
Object.keys(obj); //여기서 Object capital O임.
// result: ['a','b','c']

function anagrams(stringA, stringB) {
  const aCharMap = buildCharMap(stringA);
  const bCharMap = buildCharMap(stringB);

  if (Object.keys(aCharMap).length !== Object.keys(bCharMap).length) {
    return false;
  }

  for (let char in aCharMap) {
    if (aCharMap[char] !== bCharMap[char]) {
      return false;
    }
  }

  return true;
}

function buildCharMap(str) {
  const charMap = {};

  for (let char of str.replace(/[^\w]/g, '').toLowerCase()) {
    charMap[char] = charMap[char] + 1 || 1; // key를 정하고, value를 하나씩 올려서 assign하는 것. 아직 아무것도 없으면 1을 assign하게 하는것
  }
  
  return charMap;
}

solution 2
sort() method이용 : 알파벳 순서대로 정리해줘서 비교하기 쉬워진다.

function anagrams(stringA, stringB) {
  return cleanString(stringA) === cleanString(stringB);
}

function cleanString(str) {
  return str.replace(/[^\w]/g, '').toLowerCase().split('').sort().join('');
}

maxChar

most common character in the string / Dose string A have the same characters as string B (is it an anagram?) / Dose the given string have any repeated characters in it?
-> 이 질문들에 다 이 방법을 쓸수 있다.

  • 문제예시
    maxChar('abcccccccd') === 'c'
    maxChar('apple 1231111') === '1'

sudo code

function maxChar(str) {
  const charMap = {};
  let max = 0;
  let maxChar = '';

  for (let char of str) {
    if (charMap[char]) {
      charMap[char]++;
    } else {
      charMap[char] = 1;
    }
  }

  for (let char in charMap) //여기서 char는 key임.
  {
    if (charMap[char] > max) {
      max = charMap[char];
      maxChar = char;
    }
  }
  
  return maxChar;
}

for in loop는 object를 interator할때 사용한다 {}<-이거
str = "Hello"
{H: 1, e: 1, l: 2, O: 1}
이렇게 바꿔서 비교하는 것.

capitalize

  1. space가 없는 경우
function capitalize(str) {
  const words = [];

  for (let word of str.split(' ')) {// space로 split하는거
    words.push(word[0].toUpperCase() + word.slice(1));
  }

  return words.join(' ');
}
  1. space가 있어서 한번 더 capitalize를 해야하는 이유
function capitalize(str) {
  let result = str[0].toUpperCase();

  for (let i = 1; i < str.length; i++) {
    if (str[i - 1] === ' ') //왼쪽에 있는 charater가 space면,
    {
      result += str[i].toUpperCase(); //capitalize한다음에, result에 더한다.
    } else {
      result += str[i];
    }
  }

  return result;
}

steps

  • 문제예시
//   steps(2)
//       '# '
//       '##'
//   steps(3)
//       '#  '
//       '## '
//       '###'
//   steps(4)
//       '#   '
//       '##  '
//       '### '
//       '####'
// each step에는 space character가 step-1만큼 들어가야한다.

solution 1

sudo code
1. from 0 to n (iterate through rows)
2. create an empty string, 'stair'
3. from 0 to n (iterate through columns)
4. If the current column is equal to or less than the curren row
5. add a "#" to 'stair'
6. else add a space to 'stair'
7. console log 'stair'

function steps(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);
  }
}

solution 2
recursion 사용

sudo code
if (row === n) then we have hit the end of our problem
if the 'stair' string has a length === n then we are at the end of a row
if the length of stair string is less than or equal to the row number we're working on, we add a '#', otherwise add a space

steps(3);
function steps(n, row = 0, stair = '') {
  if (n === row) { // basic condition을 설정하고, 하나의 argument와 그의 default value를 설정한다.
    return;
  }

  if (n === stair.length) {
    console.log(stair);
    return steps(n, row + 1); 
  }

  if (stair.length <= row) {
    stair += '#';
  } else {
    stair += ' ';
  }
  steps(n, row, stair);
  }

0개의 댓글