문제
내가 작성한 정답
class Solution {
public int solution(int[] num_list) {
int answer = 0;
for(int i : num_list){
while(i != 1){
if(i%2==0) i/=2;
else i = (i-1)/2;
answer++;
}
}
return answer;
}
}다른 사람들의 정답
class Solution {
public int solution(int[] num_list) {
int answer = 0;
for(int i = 0;num_list.length>i;i++){
while(num_list[i]!=1){
num_list[i]/=2; // int타입이라 1을 빼지 않아도 소숫점 아래 날라감
answer++;
}
}
return answer;
}
}
import java.util.Arrays;
class Solution {
public int solution(int[] num_list) {
return Arrays.stream(num_list)
// 각 정수를 이진 문자열로 변환하고, 그 길이에서 1을 뺌
.map(i -> Integer.toBinaryString(i).length() - 1)
.sum();
}
}
어떤 정수를 2진수로 나타내면, 길이(length)는 그 수를 표현하는 비트 수이다
length() - 1은 가장 왼쪽(최상위) 비트가 차지하는 자리수(지수)를 의미
-> length - 1은 2진수에서 가장 큰 2의 거듭제곱 지수
2진수 길이에서 1을 빼는 값은 해당 숫자를 1이 될 때까지 나누는 횟수와 결과가 같다Share article