알고리즘/baekjoon

baekjoon(1094-막대기)_ python

ash silver 2022. 5. 15. 12:19

1) 문제

 

 

2) 예시

 

3) 제출

import sys
input = sys.stdin.readline

def stick(x):
    origin = 64 
    sum = 0
    cnt = 0
    # 구할 막대기의 길이가 전체 합보다 작을!경우 -> 같으면 안 됨!! 같으면 빠져나와야 함!
    while sum < x:  
        # 구할 막대기 길이가 64면 origin을 반 나누기 전에 확인해야 함 
        if origin == x:
            return 1
        # 막대기를 반으로 나눠 다시 저장!  
        origin = origin/2
        # sum에 자른 막대기를 더했을 때 x보다 작으면 카운팅, sum에 자른 막대기 더하기
        if origin + sum  <= x:
            cnt += 1
            sum += origin
        # 자른 막대기를 sum에 더했을 때 x보다 크면 더 잘라야 함
        else:
            continue
    return cnt

print(stick(int(input())))

4) 메모리/시간/코드길이

 

5) PLUS

어떻게 구현해야할지 열심히 노트에 적으면서 생각해봤다

x -> 구할 막대의 길이를 x로 받고

origin -> 원래의 막대 길이를 origin에 저장, origin을 계속 반으로 줄여 나감

sum -> sum에 더할 수 있는 origin값을 더하면서 x와 비교

cnt -> if문에 걸릴 때마다 막대를 붙이는 것이기 때문에 cnt로 수 체크

 

(상위권 등수에 있는 다른 사람들 풀이),,,

print(sum(list(map(int, bin(int(input()))[2:]))))
print(bin(int(input())).count("1"))
x=int(input())
cnt=0
cnt=bin(x).count('1')
print(cnt)

=> 한 줄로 끝남,,,,,

bin()함수는 2진수로 바뀌는 것인데 1이 들어있는 부분을 카운팅해 출력한다,,