✏️ 문제 설명
정수가 있을 때, 짝수라면 반으로 나누고, 홀수라면 1을 뺀 뒤 반으로 나누면, 마지막엔 1이 됩니다. 예를 들어 10이 있다면 다음과 같은 과정으로 1이 됩니다.
- 10 / 2 = 5
- (5 - 1) / 2 = 4
- 4 / 2 = 2
- 2 / 2 = 1
위와 같이 4번의 나누기 연산으로 1이 되었습니다.
정수들이 담긴 리스트 num_list가 주어질 때, num_list의 모든 원소를 1로 만들기 위해서 필요한 나누기 연산의 횟수를 return하도록 solution 함수를 완성해주세요.
제한사항
- 3 ≤ num_list의 길이 ≤ 15
- 1 ≤ num_list의 원소 ≤ 30
입출력 예
num_list | result |
[12, 4, 15, 1, 14] | 11 |
입출력 예 설명
입출력 예 #1
- 12는 3번, 4는 2번, 15는 3번, 1은 0번, 14는 3번의 연산이 필요하기 때문에 총 11번의 연산이 필요합니다.
✏️ 문제 풀이
- 내 풀이
1. for문 사용
function solution(num_list) {
let cnt = 0;
for(let i = 0; i < num_list.length; i++){
let num = num_list[i];
while(num != 1){
if(num % 2 != 0){
num -= 1;
} else {
num = num / 2;
cnt++;
}
}
}
return cnt;
}
단순한 풀이이지만 계속해서 반복문을 접하다보니 for문을 쓰는 것이 나은지 아래와 같이 forEach를 사용하는 것이 좋은지 궁금해져 그 차이를 알아보고자 한다.
2. forEach문 사용
function solution(num_list) {
let cnt = 0;
num_list.forEach((num) => {
while(num != 1){
if(num % 2 != 0){
num -= 1;
} else {
num = num / 2;
cnt++;
}
}
})
return cnt;
}
간단한 코드에도 forEach문의 성능이 더 나은 것을 알 수 있다.
for문과 forEach의 차이(참고 블로그)
- 결론은 forEach 사용 지향, for문 사용 지양
1. 동기와 비동기의 차이
for은 동기 방식이므로 for문 안에서 오류가 나면 에러 위치 이후의 이벤트들은 동작하지 않고 멈춰버림.
forEach는 ES6 문법으로 콜백함수를 뿌린다. 비동기 방식이므로 에러가 발생하더라도 멈추지 않고 동작하지만 대신 원하는 순서와는 다르게 프로그램이 동작할 수 있음.
2. 성능 차이
forEach문은 향상된 for문, 가변적인 배열이나 리스트 크기를 구할 필요가 없어 복잡한 반복문에 적합, 인덱스를 생성하여 접근하는 for문보다 수행속도가 더 빠르다.(-> 내장함수이기 때문)
- forEach 사용의 단점
1. 반복문 내에서 배열이나 리스트 값을 변경하거나 추가할 수 없다.
읽기 전용으로 불러오기 때문에 데이터를 수정하는 행위가 불가능
2. 배열을 역순으로 탐색할 수 없다.
▶ Array.prototype.forEach()
: forEach() 메서드는 각 배열 원소에 제공된 함수를 한 번 실행한다.
Syntax
forEach(callbackFn)
forEach(callbackFn, thisArg)
예시)
const items = ["item1", "item2", "item3"];
const copyItems = [];
// before
for (let i = 0; i < items.length; i++) {
copyItems.push(items[i]);
}
// after
items.forEach((item) => {
copyItems.push(item);
});
매개변수(Parameters)
- callbackFn
: 배열의 각 요소에 대해 실행할 함수입니다. 반환 값은 무시됩니다. 이 함수는 다음 인수로 호출됩니다.
- element
: 배열에서 처리 중인 현재 요소입니다.
- index
: 배열에서 처리 중인 현재 요소의 인덱스입니다.
- array
배열이 forEach() 호출되었습니다.
- thisArg(선택)
: callbackFn를 실행할 때 this로 사용할 값입니다. iterative methods를 참조하십시오.
반환 값(Return value)
: undefined.
다양한 예시에 대한 추가 학습이 필요 - 자세한 사항은 위 mdn 링크로 가서 읽어보자.
- 다른 풀이
function solution(num_list) {
return num_list.map(v => v.toString(2).length - 1).reduce((a, c) => a + c);
}
▶ Number.prototype.toString()
: 지정된 숫자 값을 나타내는 문자열을 반환한다.
Syntax
toString()
toString(radix)
예시)
function hexColour(c) {
if (c < 256) {
return Math.abs(c).toString(16);
}
return 0;
}
console.log(hexColour(233));
// Expected output: "e9"
console.log(hexColour('11'));
// Expected output: "b"
매개변수(Parameters)
: 2 ~ 36 정수, 기본값 10
반환 값(Return value)
: 지정된 숫자 값을 나타내는 문자열
🙂 공부하며 정리하는 글입니다. 잘못된 점이 있다면 피드백 주시면 감사합니다.
'Algorithms > 코테 문풀' 카테고리의 다른 글
[Greedy] 엘리스 - 구슬 꾸러미(py) (0) | 2023.07.18 |
---|---|
[프로그래머스] 바탕화면 정리 - JS (0) | 2023.06.24 |
[2022 KAKAO TECH INTERNSHIP] 성격 유형 검사하기 - JS (0) | 2023.06.03 |
[프로그래머스] 로또의 최고 순위와 최저 순위 - JS (2021 Dev-Matching: 웹 백엔드 개발) (0) | 2023.05.30 |
[2020 카카오 인턴십] 키패드 누르기 - JS (0) | 2023.05.28 |