본문 바로가기
기초다지기/JS 코딩테스트

[Lv0] js 정수 배열 홀짝 여부 판단하여 1로 만들기

by 김빵그 2023. 8. 5.

문제 

num_list 정수 배열이 주어지고 안의 정수가 짝수라면 반으로 나누고 홀수라면 1을 뺀 후 반으로 나눈다 1이 될 때까지 연산횟수를 리턴

 

 

내 해답

function solution(num_list) {
    return num_list.reduce((acc, num) => {
    while (num !== 1) {
      if (num % 2 === 0) {
        num /= 2;
      } else {
        num = (num - 1) / 2;
      }
      acc++;
    }
    return acc;
  }, 0);
}

reduce 사용 

arr.reduce(callback(accumulator, currentValue, currentIndex, array), initialValue)
  • 배열의 각 요소에대해 주어진 콜백함수를 실행하고, 이전 콜백의 반환값을 누적해 최종 결과를 반환
  • accumulator = acc : 누적 변수 / 이전 콜백의 반환값을 받아온다 초기값은 initialValue로 설정
  • currentValue  =num : 배열의  현재 요소
  • currentIndex : 배열의 현재 요소의 인덱스
  • array : 호출된 배열
  • initialValue : 옵션 누적 변수 accumulator의 초기값을 설정, 이 값이 없을 경우 배열의 첫번째 요소가 초기값이 된다

 

 

다른답들

function solution(num_list) {
    var answer = 0;

    for(let i = 0 ; i < num_list.length ; i++) {
        let num = num_list[i];
        while(num != 1) {
            num = num % 2 == 0 ? num /2 : (num - 1) / 2
            answer++;
        }
    }
    return answer;
}
function solution(num_list) {
    return num_list.map(v => v.toString(2).length - 1).reduce((a, c) => a + c);
}
  • map : 배열의 각 요소에 대해 주어진 콜백 함수 실행
  • toString(2) : toString는 숫자를 문자열로 변환, 여기서 2를 전달함으로써 10진수를  2진수로 변환 
  • length -1 :  2진수 문자열의 길이에서 1을 빼는것
  • num_list가  [5,10,3]인경우 변환된 배열은 [2,3,1]
  • 5(10진수) > 101(2진수) > 길이 3 - 1 = 2
  • 10(10진수) > 1010(2진수)  > 길이4 - 1= 3
  • 3 (10진수)> 11(2진수) > 길이 2- 1=1

 

 

 

와... toString사용하는건 생각지도 못했는데  ..한수 배웠슴더