Algorithm(하)

Jeong Yeongmin·2022년 9월 24일
0

Algorithm

목록 보기
3/9

풀었던 문제들 중 보완해야 할 코드들

function solution(a, b) {
  var answer = 0;
  if (a == b){
    answer = a;
  }
  else if (a < b){
    let len = b - a;
    let pivot = a;
    let middle = a;
    for (let i=0; i<len; i++){
      middle = middle + 1;
      pivot = pivot + middle;
      answer = pivot;
    }
  }
  else{
    let len = a - b;
    let pivot = b;
    let middle = b;
    for (let i=0; i<len; i++){
      middle = middle + 1;
      pivot = pivot + middle;
      answer = pivot;
      //console.log(middle);
      //console.log(pivot);
    }  
  }
  return answer;
}

console.log(solution(5,3));

// alternative
function solution(a,b){
  var result = 0;

  return (a+b)*(Math.abs(b-a)+1/2);
}

feedback: Math.abs를 사용하면 절대값 기능으로 Math.abs(-5) -> 5 이런 식으로 주게 됨. abs 기능 사용하면 굳이 else if, else를 사용할 필요가 없으며 등차수열 공식 사용하면 한 줄로 끝날 코드.

function solution(s) {
  var answer = 0;
  answer = Number(s);
  return answer;
}

// alternative
function solution(s){
  return s/1;
  //return +s도 가능
}

feedback: If one of the operands is a string, JS will try to convert it to a number first (ie: "5" becomes 5), or if unsuccessful, NaN is returned for the expression.This is the reason why 100/"10" gives 10 and not NaN.

JS에서 문자열과 숫자열의 사칙연산은 숫자를 리턴하기 때문에 JS의 type casting을 이용한 방법을 사용했다는 것이 신박했음. Number()을 사용할까 parseInt()를 사용할까 고민했는데 이 문제에서는 둘 다 사용 가능.
a) Number()은 무조건 숫자로 이루어진 것만 숫자로 리턴(i.e."2014"년도 --> NaN). 소수점도 인식 가능.
b) ParseInt()는 숫자와 문자 중 숫자만 인식하여 숫자로 리턴(i.e."2014"년도 --> 2014년도)하고 문제가 앞에 있을 때는 불가능하며(i.e.제"2014"년도 --> NaN) 10이하의 소수점은 반환하지 못한다.

function solution(numbers) {
  var answer = 0;
  for (let i=0; i<arr.length; i++){
    if (!numbers.includes(arr[i])){
      answer = answer + i;
    }
  }
  return answer;
}

// alternative
function solution(numbers){
	// acc: 0으로 initialized된 상태 + current number
	return 45 - numbers.reduce((acc, cur) 
    => { return acc + cur;}, 0);
}

feedback: 내가 한 방법은 수열 내에 숫자가 존재하는지 하나씩 찾는 방법이고 아래 방법은 0-9까지의 합에서 numbers의 합을 빼는 방법. 합을 구할 때는 numbers.reduce()를 사용하면 더 간단하게 코드를 쓸 수 있음.

function solution(arr1, arr2) {

var answer = [[]];
  for (let i=0; i<arr1.length; i++){
    for (let j=0; j<arr1[0].length; j++){
      arr1[i][j] = arr1[i][j] + arr2[i][j];
    }
  }
  answer = arr1; 
  return answer;
}

// alternative1
function solution(arr1, arr2) {

  var answer = [[]];
  for (let i=0; i<arr1.length; i++){
    answer[i]=[];
    for (let j=0; j<arr2.length; j++){
      answer[i].push(arr1[i][j] + arr2[i][j]);
    }
  }
  return answer;
}

// alternative2
  return arr1.map((a,i) => a.map((b,j) => b + arr2[i][j]));

feedback: 새로운 배열을 만들지 않고 arr1에 arr2를 덮었는데 이 정도 난이도의 문제에서는 가능하지만 나중에 arr1을 재사용하고 싶을 때 내 코드는 오류가 많을 것 같다는 생각을 했다. answer이 이미 array로 만들어져 있으니 push를 사용하면 arr1, arr2의 고유값을 변경시키지 않은채 새로운 배열을 만들 수 있다. 새로운 배열을 만들 때는 앞의 두 개의 방법처럼 루프를 사용해서 배열에 대해 수동으로 반복 처리하는 대신, Array.map()을 사용할 수 있다는 것을 알았다. call back이 항상 좋은 건 아니지만, array가 갖고 있는 method인 forEach(), map(), filter()과 같은 간단한 함수들은 잘만 사용하면 매우 간결하게 코드를 작성할 수 있을 것 같다.

map() function

method: 배열.map((요소, 인덱스, 배열) => { return 요소 });

map()은 반복문을 돌며 배열 안의 요소들을 1대 1로 짝지어준다. map을 실행하는 배열과 결과로 나오는 배열은 다른 객체이며 때문에 기존 배열을 수정하지 않고 새로운 배열을 만들어낸다.

0개의 댓글

관련 채용 정보