728x90
https://www.acmicpc.net/problem/12931
단순한 계산 문제입니다.
나누기는 모든 원소를 나누므로 가장 많이 나누는 경우를 구해 그 최댓값만 사용하면 됩니다.
또 빼기는 각 원소마다 따로 카운트 하므로 빼는 경우를 모두 더해주면 됩니다.
import sys
input = sys.stdin.readline
def seq(num):
# 카운트
div_cnt = 0
sub_cnt = 0
# 순회
while num:
# 2 로 나누어 떨어지면
if not num%2:
num //= 2
div_cnt += 1
# 나누어떨어지지 않으면
else:
num -= 1
sub_cnt += 1
return div_cnt, sub_cnt
def solution(N, B):
# 각 배열의 원소를 -1 과 //2 로 0 으로 바꾸는 횟수
for b in range(len(B)):
B[b] = seq(B[b])
# 뺀 횟수는 모두 더하고 나눈 횟수는 최댓값만 사용
cnt = sum([s for d, s in B]) + max([d for d, s in B])
print(cnt)
# 입력
N = int(input().strip())
B = list(map(int, input().strip().split()))
solution(N, B)
728x90
'Coding Test > BaekJoon_Python' 카테고리의 다른 글
백준 1185 <유럽여행> Python (1) | 2024.11.26 |
---|---|
백준 9251 <LCS> Python (0) | 2024.11.25 |
백준 2042 <구간 합 구하기> Python (0) | 2024.11.23 |
백준 15662 <톱니바퀴 (2)> Python (0) | 2024.11.22 |
백준 14950 <정복자> Python (1) | 2024.11.21 |