코딩 테스트/프로그래머스

[Python] 프로그래머스 lv.0 1로 만들기

위시리 2024. 11. 5. 01:05

 

정답 코드

def solution(num_list):
    answer = 0
    while list(set(num_list)) != [1]:
        for i in range(len(num_list)):
            if num_list[i] == 1 :
                continue
            if num_list[i] % 2 == 0:  # 짝수라면
                num_list[i] = num_list[i] // 2
                answer += 1
            else:  # 홀수라면
                num_list[i] = (num_list[i] - 1) // 2
                answer += 1
    return answer

 

다른 사람 코드 1

def solution(num_list):
	return sum(len(bin(i))-3 for i in num_list)

예를 들어 i=12 일때, bin(i) 를 하면 '0b1100' 이 됩니다. 여기서 우리는 마지막으로 남겨야 하는 1; 즉 2^0인 맨끝의 '0'과 과 이진수를 나타내는 앞의 '0b' 총 길이 3을 제외한 나머지 숫자들인 "110" 을 없애는 것이 목표값이 되는데, 이는 각 자리마다 2를 나누는 횟수기 때문에 "110"의 길이인 3이 됩니다. 홀 수 일 때는 어차피 -1을 해서 짝수로 만들기 때문에 가능합니다.

2진법으로 표현된 정수의 가장 큰 자릿수만큼 2로 나눌수 있다

 

다른 사람 코드 2

def solution(num_list):
    answer = 0

    for n in num_list:
        while n != 1:
            n //= 2
            answer += 1

    return answer