[JS] 코딩테스트 연습 - 5 (TIL)

이해용·2022년 9월 19일
0
post-thumbnail
post-custom-banner

약수의 개수와 덧셈

문제 설명
두 정수 leftright가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

제한사항
1 ≤ leftright ≤ 1,000

입출력 예

leftright
1317
2427

입출력 예 설명

입출력 예 #1

다음 표는 13부터 17까지의 수들의 약수를 모두 나타낸 것입니다.

약수약수의 개수
131, 132
141, 2, 7, 144
151, 3, 5, 154
161, 2, 4, 8, 165
171, 172

따라서, 13 + 14 + 15 - 16 + 17 = 43을 return 해야 합니다.

입출력 예 #2

다음 표는 24부터 27까지의 수들의 약수를 모두 나타낸 것입니다.

약수약수의 개수
241, 2, 3, 4, 6, 8, 12, 248
251, 5, 253
261, 2, 13, 264
271, 3, 9, 274

따라서, 24 - 25 + 26 + 27 = 52를 return 해야 합니다.

나의 풀이

function solution(left, right) {
  let answer = 0;
  for (let i = left; i <= right; i++) {
    let count = 0;  	
    for (let j = 0; j <= i; j++) {
      if (i % j === 0) {
        count += 1;
      }
    } count % 2 === 0 ? answer += i : answer -= i;
  } return answer;
}
  1. 결과를 선언 후 left와 right 수 사이를 하나씩 증가하면서 확인할 for문을 선언한다.
  2. 약수의 개수를 확인할 count를 선언 후 약수를 확인하기 위한 두 번째 for문을 선언한다.
  3. i의 값이 j로 나눴을 때 나머지가 0이되면 약수이므로 약수일 경우 count가 증가되도록 설정한다.
  4. count가 짝수인지 확인하기 위해 count의 나머지가 2라면 answer에는 i 의 값을 더해주고 아니라면 i의 값을 빼준 후 answer를 리턴한다.

다른 풀이

function solution(left, right) {
  var answer = 0;
    for (let i = left; i <= right; i++) {
        if (Number.isInteger(Math.sqrt(i))) {
            answer -= i;
        } else {
            answer += i;
        }
    }
    return answer;
}
  1. 제곱근이 정수면, 약수의 개수가 홀수이다.
  2. Number.isInteger로 boolean값을 확인하고 제곱근이 정수라면 answer에 i의 값을 빼주고 제곱근이 정수가 아니라면 i를 더해준다.

Number.isInteger()

  • Number.isInteger() 메서드는 값이 Number 타입의 정수라면 true를 반환하고 반대라면 false를 반환합니다.

문법
Number.isInteger(value)

느낀점

새로운 매서드에 대해 배웠고 for문을 두 번 사용하는 것을 지양하고 싶은데 for문부터 생각나게 된다.

행렬의 덧셈

문제 설명
행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

제한 조건
행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.

입출력 예

arr1arr2return
[[1,2],[2,3]][[3,4],[5,6]][[4,6],[7,9]]
[[1],[2]][[3],[4]][[4],[6]]

나의 풀이

function solution(arr1, arr2) {
    let result = [];
  	for (let i = 0; i < arr1.length; i++) {
      let result2 = [];
      for (let j = 0; j < arr1[0].length; j++) {
        result2.push(arr1[i][j]+arr2[i][j]);
      } result.push(result2);
    }
    return result;
}
  1. result 빈 배열을 선언 후 가장 바깥의 배열의 길이만큼 for문이 증가될 수 있도록 선언한다.
  2. result2의 빈 배열을 선언 후 두 번째 for문은 배열안의 배열의 길이만큼 for문의 증가될 수 있도록 선언한다.
  3. result2에 arr1과 arr2의 요소끼리 더한 값을 push한다.
  4. result2의 배열을 result배열에 push 한다.
  5. result를 리턴한다.

다른 풀이

function solution(arr1, arr2) {
   return arr1.map((a, i) => a.map((b, j) => b + arr2[i][j]));
}
  1. arr1의 배열에 map을 사용하여 호출하며 인덱스 i를 선언한다.
  2. arr1의 배열안에 배열에서 두 번째 map을 사용하여 호출하며 인덱스 j를 선언한다.
  3. 2번의 값 b를 arr2[i][j] 값을 더해준 값을 반환하면 원하는 arr1과 arr2의 값이 서로 더해져서 리턴된다.

Array.prototype.map()

  • map()은 모든 배열 요소에 대한 함수를 호출하여 새 배열을 만듭니다.
  • map()은 배열에서 각각의 요소들에 대해 한 번 함수를 호출합니다.
  • map()은 비어있는 요소에 대해 함수를 실행하지 않습니다.
  • map()은 원본 배열을 변화시키지 않습니다.

문법
array.map(function(currentValue, index, arr), thisValue)

ParameterDescription
function()필수. 각각 배열의 요소에 대해 실행 될 함수.
currentValue필수. 현재 요소에 대한 값.
index옵션. 현재 요소의 인덱스.
arr옵션. 현재 요소의 배열.
thisValue옵션. Default value undefined. this 값으로 사용할 함수에 전달된 값.

느낀점

map을 자주 사용했으나 코테에서 간단하게 사용하는 방법 말고 map을 두 번 사용할 수 있구나라고 알게 되었다. index를 사용하면 for문을 2번 사용하는 것 처럼 할 수 있지만 짧게 코드를 간결하게 사용할 수 있다라는 것을 느꼈다.

reference
https://school.programmers.co.kr/
https://www.w3schools.com/jsref/jsref_isinteger.asp
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map
https://www.w3schools.com/jsref/jsref_map.asp

profile
프론트엔드 개발자입니다.
post-custom-banner

0개의 댓글