본문 바로가기

프로그래밍 회고록/Python

2021.21.19 코테_큰 수의 법칙

728x90
반응형

# 오늘의 문제

이것이 코딩 테스트다. 챕터3-2 92page 큰 수의 법칙

 # 나의 코드

conditionList = list(map(int, input().split()))
numList = list(map(int, input().split()))

numList.sort(reverse = True)

num1 = numList.pop(0)
num2 = numList.pop(0)
total = 0
x = conditionList[1] % conditionList[2] 
temp = num1
k = 0
for i in range(0,conditionList[1]):

    if( num1 != num2):
      if( i % conditionList[2] == x):
        total = total + num2 
      else:
        total = total + num1
    else:
      total = total + temp
      if( i % conditionList[2] == x):
        if( temp == num1):
          temp = num2
        else:
          temp = num1
print(total)

# 정답과의 비교

1. 내 코드는 첫번째 큰 수와 두번째 큰 수 값이 같은경우와 다른경우 두가지를 분기를 주었다

하지만 첫번째 큰 수를 연속덧셈이 가능한 K번 까지 더하고 두번째 큰 수를 한번만 더하면 결과적으로 같은 코드가 되는데 그부분을 놓쳤다.

 

2. 연속 덧셈이 가능한 큰수 K번에 + 1번의 두번째 큰 수는 k+1가 배열로 더하는수 M까지 루프를 도는 수열이니

M/K+1 을 하면 총 도는 수열의 횟수 거기에 K를 곱하면 M번중 K번의 등장횟수가 되고 M이 k+1로 나누어 지지 않는 경우도 있기 때문에 (M/K+1)*k + ( M%K+1 ) 가 가장 큰 수가 등장하는 횟수가 된다. 이를 가지고 정답인 코드를 짜게되면

n,m,k = map(int, input().split())
data = list(map(int, input().split()))

data.sort()
first = data[n-1]
second = data[n-2]

count = int(m/ (k+1)) * k
count += m % ( k +1 )

result = 0
result += count * first
result += (count -m) * second

print(result)

 

728x90