자바스크립트 코딩테스트 연습 3일차

Y·2020년 7월 30일
0

문제 1


내 풀이


function sumTwoSmallestNumbers(numbers) {
  const answerlist=[];
  let answer =0;
  for(let i=0;i<2;i++){
    const minimum = Math.min.apply(null,numbers);
    const minimumIdx = numbers.indexOf(minimum);
    answer += minimum
    numbers.splice(minimumIdx,1)
  }
  return answer
}

apply()메서드를 통해 Math.min()메서드를 사용하여 최솟값을 2번 찾아주는 과정이다. 찾을때마다 배열에서 제거해준다.

추천 풀이


function sumTwoSmallestNumbers(numbers){  
  numbers = numbers.sort(function(a, b){return a - b; });
  return numbers[0] + numbers[1];
};

공부


되게 간단했다. 내 코드보다 훨씬 간결하다. 왜 이렇게 풀 생각을 못했나 싶다. 앞서 공부했던 sort()메서드와 compareFunction으로 오름차순으로 정렬후 0번 1번 인덱스값을 더한것이다.

문제 2


내 풀이


function solution(number){
  const numList= [];
  for(let i=1;i<number;i++){
    numList.push(i)
  };
  const answer = numList.reduce((acc,cur) => {
    if ((Math.ceil(cur/3) === cur/3) || (Math.ceil(cur/5) === cur/5)){
      return acc += cur
    } else{
      return acc
    }
  },0)
  return answer
}

우선적으로 배열을 생성하고, reduce를 통해 현재원소가 3또는 5로 나누어지면 더해준다. 멍청했던건, % 연산자가 생각이 안나서 저런식으로 했다는거다..

추천 풀이


function solution(number){
  var sum = 0;
  
  for(var i = 1;i< number; i++){
    if(i % 3 == 0 || i % 5 == 0){
      sum += i
    }
  }
  return sum;
}

공부


굳이 내가 배열을 만들고시작하지 않았어도 됐을것 같다.

문제 3


내 풀이


function pigIt(str){
  const wordList = str.split(' ');
  const answer = wordList.map(function (str) {
    const wordArr = str.split('')
    const firstWord= wordArr.shift()
    if (!(str === "?" || str === "!")){
      wordArr.push(firstWord)
      return wordArr.join('') + "ay"
    }else {
      return str
    }
  })
  return answer.join(' ')
}

문자열을 띄어쓰기단위로 쪼개고, map()메서드를 통해 문자열의 앞문자를 뒤로 보내주고 "ay"를 붙여주는 함수를 적용했다. punctuationMark들을 정규표현식으로 필터링하려고했는데 안되서 그냥 ?,! 를 직접 걸렀다. 그후에 join()메서드로 합쳐줬다.

추천 풀이


function pigIt(str){
  return str.replace(/(\w)(\w*)(\s|$)/g, "\$2\$1ay\$3")
}

우선 이 코드를 이해하기위해 정규표현식을 공부해야했다.

공부


\w는 영숫자 문자에 대응된다.
\w**앞의 표현식이 0회이상 반복된다.
\s|$에서 \s는 스페이스,탭,줄바꿈문자등 공백문자에 대응하고, |는 or의 의미이며, $는 입력의 끝부분과 대응된다. 공백을 의미한다.
$1,$2,$3 은 탐색할 정규표현식에서 ()로 묶어 구분한 1번,2번,3번 째 요소를 의미한다.
즉, 맨앞의문자와 나머지 문자열의 순서를 바꿔주고, 공백을 더해 영숫자 문자열만 replace 한다. 정말 천재적인 것 같다..

참고 https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/%EC%A0%95%EA%B7%9C%EC%8B%9D#special-word-boundary

profile
연세대학교 산업공학과 웹개발 JavaScript

0개의 댓글