문제

 

풀이 코드

function solution(a, b) {
  let min = a < b ? a : b;
  return [...Array(Math.abs(a - b) + 1).keys()]
    .map((item) => item + min)
    .reduce((sum, item) => sum + item, 0);
}

 

풀이 과정

범위의 값을 저장 하기위해 검색을 했다

keys() 함수를 쓰면, 0부터 차례대로 연속된 수를 저장할수 있다!

Array의 크기를 두수의 차이 + 1 만큼 지정해주고,

 

a 와 b 중 최솟값을 삼항연산자로 구한다음, map 과 reduce 를 이용해 수의 합을 구했다.

 

채점 통과가 되긴 했으나, 시간이 좀 오래걸렸다 아무래도 함수를 많이 사용하고 그래서 그런거같다

다른사람의 코드를 참고해야만 할거 같아서 제출하고 다른 풀이를 봤다

 

다른사람의 코드

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

할말을 잃었다

 

두수의 합 * 두수 사이의 범위 크기 / 2

 

와;; 이거만 하면 배열을 생성할 일도 없고 그냥 바로 계산이 가능하다

갓갓

문제

 

풀이 코드

function solution(s) {
  let sLower = s.toLowerCase().split('');
  let pCount = sLower.filter((item) => item === 'p').length;
  let yCount = sLower.filter((item) => item === 'y').length;

  return pCount === yCount;
}

 

풀이 과정

우선, 문자열내의 모든 요소를 소문자로 변경해주고 해당 문자열을 배열로 만들었다. ( toLowerCase, split )

그리고 나서 filter 함수를 통해 p 와 y 만 저장한 배열을 각각 생성하고, 해당 배열의 길이를 각각의 변수에 저장했다.

 

그리고 그냥 같은지 비교한 값을 반환시켰다

 

이거 제출하고 나서 생각한건데 변수의 쓰임세와 상수의 쓰임세를 각각 구분해서 사용하면 좋을 것 같다.

해당 코드에서 변수는 사실 필요없다.

 

모두 const 로 상수정의 하는게 바람직함

 

다른사람의 코드

// 1 번
function numPY(s){
    return s.toUpperCase().split("P").length === s.toUpperCase().split("Y").length;
}

// 2 번
function numPY(s) {
  return s.match(/p/ig).length == s.match(/y/ig).length;
}

1 번의 풀이처럼 한줄로 간단하게, 그리고 split 만으로 바로 구분해서 풀이할수가 있다. 이건 생각 못했다

 

2 번 풀이의 경우 댓글들을 보니 p 나 y 가 아예 없을경우, 오답이 발생한다고 나와있어서 정답은 아닌거 같지만 그럼에도 가져온 이유는

math 라는 함수를 처음보기 때문이다. math 라는 함수도 공부해 봐야 겠다

문제

 

풀이 코드

function solution(s) {
  return s.split('').sort().reverse().join('');
}

 

풀이 과정

이제 조금씩 자바스크립트 고차함수들에 익숙해지는것을 느낀다!

 

split 으로 각 글자를 나누어 배열로 만들고,

sort 로 오름차순 정렬!

reverse 로 순서를 뒤집어 내림차순 정렬!

join 으로 배열을 문자열로!

문제

 

풀이 코드

function solution(seoul) {
    return `김서방은 ${seoul.indexOf("Kim")}에 있다`
}

 

풀이 과정

설명이 필요 없을것으로 예상되는 문제다

 

` ` 사이에 변수를 사용할수 있다는것!

Array.indexOf() 로 인덱스를 찾을수 있다는것!

 

두가지만 알면 될거같다!

문제

 

풀이 코드

function solution(n) {
  let numArr = new Array(n).fill(1);
  for (let i = 2; i * i <= n; i++)
    for (let j = i * i; j <= n; j += i) numArr[j - 1] = 0;
  return numArr.reduce((sum, item) => sum + item, 0) - 1;
}

 

풀이 과정

어려운 문제였다 혼자 해결을 못하고 구글링을 통해 개념을 숙지했다

역시 나는 한참 부족하다

 

일단 소수찾는 알고리즘으로 에라토스테네스의 체 라는 개념을 알고 있어야 한다.

https://ko.wikipedia.org/wiki/에라토스테네스의_체

 

정말 간단히 설명하면 다음과 같다.

 

1. 소수가 아닌 수는 배수로 이루어진다.

2. 배수를 제거하면 남는 수들이 결국 소수가 된다.

 

이 개념을 바탕으로, 코드를 참고하여 작성하였다.

 

코드의 순서는 다음과 같다.

1. 우선, n 크기의 배열을 생성하고, 해당 배열에 fill 함수를 통하여 모든 요소를 1로 세팅한다.
2. 이전에 약수를 구하는 알고리즘과 마찬가지의 이유로, 모든 수를 비교 하는것은 시간적으로 너무 많이 낭비된다, 이를 해결하기 위해 제곱근으로 비교하며 for 루프를 돈다.
3. 순회 할때마다, 해당수의 배수에 해당하는 요소들의 인덱스를 0으로 설정한다. ( j - 1 )을 하는 이유는 인덱스는 0부터 시작하기 때문.
4. 그렇게 모든 수 까지 순회하고 나면, 소수가 위치한 인덱스만 1이된다.
5. reduce 함수를 이용해 모든 요소를 더해주면 소수의 갯수가 될것이다.
6. 단, 여기에는 1 도 포함되지만, 1은 소수가 아니므로 1을 빼준다.

+ Recent posts