본문 바로가기

Algorithm/Greedy

큰 수의 법칙

 

문제

큰수의 법칙 : N개의 다양한 수로 이루어진 배열이 있을 때 주어진 수들을 M번 더해서 가장 큰 수를 만드는 법칙 단, 배열의 특정한 인덱스에 해당하는 수가 연속해서 K번을 초과하여 더해질 수 없다.

- 용량 : 128MB, 시간 : 1초

- 2 <= N <= 1000

- 1 <= M <= 10000

- 1 <= K <= 10000

 

입력 예시

5 8 3 (N, M, K)

2 4 5 4 6 (숫자 배열)

 

출력 예시

46

 

 

 

해결

알고리즘 유형

  • 구현 알고리즘(게임 형태의 프로그램을 구현하는 알고리즘)
  • DFS/BFS 알고리즘(그래프간 연결성을 탐색하는 알고리즘)
  • 정렬 알고리즘(조건에 따라 데이터를 정렬하는 알고리즘)
  • 이진탐색 알고리즘(그래프에서 특정 데이터를 찾는 알고리즘)
  • 다이나믹 알고리즘(순차적인 알고리즘 결과가 서로 영향을 미칠때 결과를 기록하고 처리하는 알고리즘)
  • 최단 경로 알고리즘(노드와 노드간 가장 짧은 거리를 찾는 알고리즘)
  • 그래프 이론 알고리즘(그래프에서 서로 연결된 노드를 나누는 알고리즘)

이 문제는 내가 아는 유형에 속하지 않으므로 그리디 알고리즘이다.

또한 "가장 큰"이라는 단어가 문제에 들어갔으니 그리디 알고리즘이 더욱 의심된다.

 

 

아이디어

- 데이터를 큰 순서대로 정렬

- result += 가장 작은 인덱스(가장 큰 수) * (M//K*K)

- result += 두번째 인덱스(두번째로 큰 수) * (M%K)

 

 

코드

n, m, k = 5, 8, 3
num = [2, 4, 5, 4, 6]
num.sort(reverse=True)
print(num[0]*(m//k)*k + num[1]*(m%k))

 

 

정당성 체크 및 방식

- 이 문제는 정당성 체크할 필요없이 직관적으로 가장 큰 수를 만들기 위해서는 가장 큰 수들을 더해야한다는 생각이 떠오른다.

- 한 수의 반복은 K번까지이다.

- 가장 큰 수를 K번 더하고 두번째로 큰 수를 한번 더하는 과정을 반복한다.

 

용량 체크

- 고려해야할 부분이 데이터 받는 부분밖에 없는데 이는 딱히 고려할 필요가 없어서 패스

 

시간 체크

- 고려할 부분이 sort 정도인데, python의 sort 시간 복잡도는 NlogN 이다.

- 파이썬은 평균적으로 1초에 5000만번 계산이 가능하다.

- log의 밑이 2이고 최대 1000log1000인데 약 1만번으로 다소 충분하다.

'Algorithm > Greedy' 카테고리의 다른 글

곱하기 혹은 더하기  (0) 2023.04.04
모험가 길드  (0) 2023.04.04
1이 될 때까지  (0) 2023.04.04
숫자 카드 게임  (0) 2023.04.03
Greedy - Concept  (0) 2023.04.03