문제
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사용하는건 생각지도 못했는데 ..한수 배웠슴더
'기초다지기 > JS 코딩테스트' 카테고리의 다른 글
[Lv0] js 배열내 2의 영역 (0) | 2023.08.17 |
---|---|
[Lv0] js for ...of 를 사용한 수열과 쿼리 (0) | 2023.08.10 |
[Lv 0] js 해당 인덱스 문자열 지우기 (0) | 2023.08.03 |
배열 순서 위치 변경하기 (0) | 2023.08.02 |
[Lv0] 빈배열 추가 삭제 (1) | 2023.08.01 |