저장을 습관화
프로그래머스 LV.0 1로 만들기 본문
프로그래머스 LV.0 1로 만들기
https://school.programmers.co.kr/learn/courses/30/lessons/181880
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 문제 명
1로 만들기
2. 문제 설명
정수가 있을 때, 짝수라면 반으로 나누고, 홀수라면 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. 제한 사항
- 3 ≤ num_list의 길이 ≤ 15
- 1 ≤ num_list의 원소 ≤ 30
4. 예시
num_list | result |
[12, 4, 15, 1, 14] | 11 |
5. 기본 제공 코드
function solution(num_list) {
var answer = 0;
return answer;
}
6. 제출한 내 답
const solution = (num_list) => {
const calculation = (n) => {
let count = 0;
while (n !== 1) {
n % 2 ? (n = (n - 1) / 2) : (n = n / 2);
count++;
if (n === 1) {
return count;
}
}
return count;
};
return num_list.reduce((a, b) => {
return (a += calculation(b));
}, 0);
};
6-2. VSC에 작성한 내용
const solution = (num_list) => {
// 정수 n
// n이 짝수라면 n/2
// n이 홀수라면 (n-1)/2
// 이 작업을 1이 될때까지 반복한다.
const calculation = (n) => {
let count = 0;
while (n !== 1) {
n % 2 ? (n = (n - 1) / 2) : (n = n / 2);
count++;
if (n === 1) {
return count;
}
}
return count;
};
return num_list.reduce((a, b) => {
return (a += calculation(b));
}, 0);
};
// 테스트
console.log(solution([12, 4, 15, 1, 14]));
7. 특이사항
없음
8. 다른 사람이 작성한 답
8-1.
function solution(num_list) {
return num_list.map(v => v.toString(2).length - 1).reduce((a, c) => a + c);
}
1) 배열의 각 요소를 .toString(2)로 2진수로 바꾼다. (예: 12 => 1100)
2) 1100.length는 4가 되며 -1을 함으로써 3이라는 결가가 나온다... 인데
솔직히 어떤 원리인지 이해가 가지 않는다.
이 과정이 '짝수일 경우 2로 나누고, 홀수일 경우 1을 뺀 뒤 2로 나눈다. 이를 1이 될때까지 반복한다.'와 어떻게 동일할 수 있는거지
'코딩 테스트 > 프로그래머스 - 자바스크립트' 카테고리의 다른 글
프로그래머스 LV.0 특정 문자열로 끝나는 가장 긴 부분 문자열 찾기 (0) | 2023.09.25 |
---|---|
프로그래머스 LV.0 가까운 수 (0) | 2023.09.25 |
프로그래머스 LV.0 숨어있는 숫자의 덧셈 (2) (0) | 2023.09.25 |
프로그래머스 LV.1 없는 숫자 더하기 (0) | 2023.09.25 |
프로그래머스 LV.0 k의 개수 (0) | 2023.09.24 |