매일공부

[코딩테스트 python] 그리디 Greedy ; 큰수의 법칙 본문

Programming/코딩테스트

[코딩테스트 python] 그리디 Greedy ; 큰수의 법칙

aram 2023. 4. 23. 23:42

 

#저서 : 이것이 취업을 위한 코딩테스트다 with 파이썬

#기출 : 2019 국가 교육기관 코딩 테스트

# 문제

주어진 수들을 M번 더하여 가장 큰 수 만들기.

# 제한사항

  • 배열의 특정한 인덱스에 해당하는 수가 연속으로 K번 초과하여 더해질 수 없음.
  • 서로 다른 인덱스에 해당하는 수가 같은 경우에도 서로 다른 것으로 간주
  • 첫째 줄 : N(2<= N <= 1,000) M(1<= M <= 10,000) K(1<= K <= 10,000) >> 공백으로 구분
  • 둘째 줄 : N개의 자연수 >> 공백으로 구분. 단, 각각의 자연수는 1 ~ 10,000의 수
  • 입력으로 주어지는 K는 항상 M보다 작거나 같다

 

처음 풀이

n, m, k = map(int, input().split())
n_arr = sorted(list(map(int, input().split())), reverse=True)

answer = 0
for i in range(1, m+1):
  if i%k == 0:
    answer += n_arr[1]
  else:
    answer += n_arr[0]

print(answer)

이 경우, M의 크기가 100억이 넘어가면 시간 초과!
반복되는 수열을 파악해서 시각복잡도를 줄여함.

> k의 배수의 개수 만큼 1번이 더해지고, 나머지는 0번이 더해짐.
> m // k  == 나눈 몫 만큼 가장 큰 수 1번이 더해짐

 

수정 풀이

n, m, k = map(int, input().split())
n_arr = sorted(list(map(int, input().split())), reverse=True)

answer = n_arr[0]*(m-m//k)+n_arr[1]*(m//k)
print(answer)

 => 반복문도 좋지만 반복되는 수열을 먼저 찾아보는 수학적 아이디어를 생각해보는 것이 효율적!!

 

Comments