[Javascript] JS Algorithm

eslim·2020년 9월 12일
1

Javascript

목록 보기
5/12
post-thumbnail

JS 코드카타

Day-1. Question

  1. 로마자에서 숫자로 바꾸기

    1~3999 사이의 로마자 s를 인자로 주면 그에 해당하는 숫자를 반환해주세요.
    로마 숫자를 숫자로 표기하면 다음과 같습니다.

    Symbol Value
    I 1
    V 5
    X 10
    L 50
    C 100
    D 500
    M 1000

로마자를 숫자로 읽는 방법은 로마자를 왼쪽부터 차례대로 더하면 됩니다.
III = 3
XII = 12
XXVII = 27
입니다.

그런데 4를 표현할 때는 IIII가 아니라 IV 입니다.
뒤의 숫자에서 앞의 숫자를 빼주면 됩니다. 
9는 IX입니다.

I는 V와 X앞에 와서 4, 9
X는 L, C앞에 와서 40, 90
C는 D, M앞에 와서 400, 900 

Answer

function romanToNum(s) {
  let matching = {
      I: 1,
      V: 5,
      X: 10,
      L: 50,
      C: 100,
      D: 500,
      M: 1000
  }
  let strArr = s.split('');
  let numArr = strArr.map(el => matching[el]);
  let sum = 0;
  for (let i = 0; i < numArr.length; i++) {
      if (numArr[i] < numArr[i+1]) {
          sum += (numArr[i+1] - numArr[i]);
          i++;
      } else {
          sum += numArr[i];
      }
  }
  return sum;
}

Day-2. Question

  1. 숫자로 이루어진 배열인 nums를 인자로 전달합니다.
    숫자중에서 과반수(majority, more than a half)가 넘은 숫자를 반환해주세요.

    nums = [3,2,3]
    return 3

nums = [2,2,1,1,1,2,2]
return 2

Answer


function moreThanHalf(nums) { 
    
    for(let i = 0; i < nums.length; i++){
      let count = 0;
      for(let j = i; j < nums.length; j++){
        if(nums[i] === nums[j]){
          count += 1;
        }
        if( count > nums.length / 2 ){
          return nums[j];
        }
      }
    }

}

moreThanHalf([1,1,2,2])

Day-3. Question

  1. s는 여러 괄호들로 이루어진 String 인자입니다.
    s가 유효한 표현인지 아닌지 true/false로 반환해주세요.

    종류는 '(', ')', '[', ']', '{', '}' 으로 총 6개 있습니다.
    아래의 경우 유효합니다.
    한 번 괄호를 시작했으면, 같은 괄호로 끝내야 한다.
    괄호 순서가 맞아야 한다.

Answer

function isValid(s) {
 // 미해결......;;;;; 
}

Day-4. Question

  1. nums는 숫자로 이루어진 배열입니다.
    가장 자주 등장한 숫자를 k 개수만큼 return해주세요.

    nums = [1,1,1,2,2,3],
    k = 2

    return [1,2]

    nums = [1]
    k = 1

    return [1]

Answer

function topK(nums, k) {
  const count = {};
  result = [];
  nums.forEach((el)=> {count[el] = (count[el]) ? ++count[el] : 1});
  let mostUsedKey = (obj) => {
    let res = Object.keys(obj).reduce((pre, cur) => count[pre] > count[cur] ? pre : cur);
    return res;
  }
  for (let i=0; i<k; i++) {
    result.push(parseInt(mostUsedKey(count)));
    delete count[parseInt(mostUsedKey(count))];
  }
  return result;
}

Day-5. Question

  1. 인자인 height는 숫자로 이루어진 배열입니다.
    그래프로 생각한다면 y축의 값이고, 높이 값을 갖고 있습니다.

    아래의 그래프라면 height 배열은 [1, 8, 6, 2, 5, 4, 8, 3, 7] 입니다.

    저 그래프에 물을 담는다고 생각하고,
    물을 담을 수 있는 가장 넓은 면적의 값을 반환해주세요.

Answer

function getMaxArea(height) {
  let result = 0;
  for(let i=0; i<height.length; i++){
    for(let j=i+1; j<height.length; j++){
       result = Math.max((Math.min(height[i],height[j]) * (j-i)), result);
    }
  } 
  return result;
}

0개의 댓글