본문 바로가기
Problem Solving/BOJ

[BOJ][Python]1094 풀이

by NoiB 2023. 6. 26.
반응형

https://www.acmicpc.net/problem/1094

 

1094번: 막대기

지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대

www.acmicpc.net

x = int(input())
w = [64, 32, 16, 8, 4, 2, 1]
c = 0
cnt = 0
for i in range(len(w)):
    if w[i] > x:
        continue
    elif w[i] == x:
        print(1)
        break
    else:
        if c + w[i] <= x:
            c += w[i]
            cnt += 1
            if x == c:
                print(cnt)
                break

사실 이번엔 풀이라고 올리기도 좀 창피한 코드입니다. 뭔가 개선을 해보고 싶은데 뾰족한 수가 떠오르질 않네요. 코드를 굳이 설명하자면 x값과 나눠진 막대의 길이가 같다면 1을 출력하고 더 작은 경우 합해서 만들어야 하니 합이 같아질 때 까지 반복을 하는 형태의 코드입니다.

이번엔 가장 빠른 시간이 나온 다른 분의 코드인데 정말 괜찮은 것 같아서 소개해드리려고 합니다.

print(int(input()).bit_count())

코드를 풀이하면 입력을 이진수로 변환한 다음 나오는 1의 개수를 반환하는 것입니다. 눈치 빠른 분들은 알아차렸겠지만 풀어서 쓴다면 이진수를 10진수로 변환하는 과정이 해당 문제를 해결하는 방식과 완전히 동일하다는 것입니다. 예를 들어 64를 이진수로 변환하면 1000000이 되어 64길이의 막대 1개만 필요하다는 뜻이 되죠. 23이라면 0010111으로 막대 4개가 필요하다는 결과와 동일해지는 것입니다. 정말 세상엔 번뜩이는 생각을 가지신 분들이 많은 것 같네요.

반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ][Python]4344 풀이  (0) 2023.06.28
[BOJ][Python]1015 풀이  (0) 2023.06.27
[BOJ][Python]1032 풀이  (0) 2023.06.25
[BOJ][Python]1076 풀이  (0) 2023.06.24