본문 바로가기
  • Staying curious, growing through questions
Python/코딩테스트

[이코테 3-2] 큰 수의 법칙

by Evergreen Mind 2024. 6. 29.

입력 조건

  • 첫째 줄에 N(2 <= N <= 1,000), M(1 <= M <= 10,000), K(1 <= K <= 10,000)의 자연수가 주어지며, 각 자연수는 공백으로 구분한다.
  • 둘째 줄에 N개의 자연수가 주어진다. 각 자연수는 공백으로 구분한다. 단, 각각의 자연수는 1 이상 10,000 이하의 수로 주어진다.
  • 입력으로 주어지는 K는 항상 M보다 작거나 같다.

출력 조건

  • 첫째 줄에 동빈이의 큰 수의 법칙에 따라 더해진 답을 출력한다.

 

나의 풀이

def solution():
  N, M ,K = map(int, input().split())
  data = map(int, input().split())

  # 데이터 오름차순 정렬
  data = sorted(data)
  max_num = data[-1]
  second_num = data[-2]
  
  a = M // (K+1)
  b = M % (K+1)

  if M  <=  K:
    answer = max_num * K
  else:
    answer = a*(max_num * K + second_num)+ b*second_num

  return answer

print(solution())

 

여기에서 data.sort()와 sorted(data)의 차이를 알아보자.

data.sort()

  • list에만 적용 가능하다
  • data 자체를 바꾼다(즉 in-place)
  • None을 반환한다. 즉 data = data.sort()라고 쓸 수 없다.

 

sorted(data)

  • 원래의 리스트를 변경하지 않고, 정렬된 새로운 리스트를 반환
  • 리스트 뿐 아니라, 튜플 , 딕셔너리, 문자열 등에 모두 사용할 수 있다. 

 

책의 풀이 

N, M ,K = map(int, input().split())
data =  list(map(int, input().split()))

# 데이터 오름차순 정렬
data.sort()
first = data[-1]
second = data[-2]

result = 0

while True:
  for i in range(K): # 가장 큰 수를 K번 더하기
    if M == 0:
      break
    result = result + first
    M = M -1
  if M == 0:
    break
  result = result + second
  M = M -1