큰 수의 법칙
'큰 수의 법칙' 은 일반적으로 통계 분야에서 다루어지는 내용이지만 글쓴이는 본인만의 방식으로 다르게 사용하고 있다. 글쓴이의 큰 수의 법칙은 다양한 수로 이루어진 배열이 있을 때 주어진 수들을 M번 더하여 가장 큰 수를 만드는 법칙이다. 단, 배열의 특정한 인덱스(번호)에 해당하는 수가 연속해서 K번을 초과하여 더해질 수 없는 것이 이 법칙의 특징이다.
예를 들어 순서대로 2, 4, 5, 4, 6 으로 이루어진 배열이 있을 때 M이 8이고, K가 3이라고 가정하자.
이 경우 특정한 인덱스의 수가 연속해서 세번까지만 더해질 수 있으므로 큰 수의 법칙에 따른 결과는 6 + 6 + 6 + 5 + 6 + 6 + 6 + 5 인 46이 된다.
단, 서로 다른 인덱스에 해당하는 수가 같은 경우에도 서로 다른 것으로 간주한다.
예를 들어 순서대로 3, 4, 3, 4, 3 으로 이루어진 배열이 있을 때 M이 7이고, K가 2라고 가정하자.
이경우 두번쨰 원소에 해당하는 4와 네번 째 원소에 해당하는 4를 번갈아 두 번 씩 더하는 것이 가능하다.
결과적으로 4 + 4 + 4 + 4 + 4 + 4 + 4 인 28이 도출된다.
문제
배열의 크기 N, 숫자가 더해지는 횟수 M, 그리고 K가 주어질 때 위에서 알아본 큰 수의 법칙에 따른 결과를 출력하시오
input
5 8 3
2 4 5 4 6
output
46
input
5 7 2
3 4 3 4 3
output
28
내 풀이
n, m, k = map(int, input().split())
arr = list(map(int, input().split()))
sorted_arr = sorted(arr, reverse=True)
div_num = m // k
add_cnt = m % k
ans = div_num * (sorted_arr[0] * k)
ans += sorted_arr[1] * add_cnt
print(ans)
문제를 읽고 풀이가 두 가지로 나뉠거라 생각했다.
단순하게 가장 큰 수를 K번 더하고 그 다음 큰 수를 1번 더하고 다시 가장 큰 수를 K번 더하는 반복하는 로직을 작성하는 것과 중복되는 것을 한번에 처리하고 남은 계산만 따로 하는 것 두 가지 방법이 있다.
그 중에 첫 번째 방법은 구현하다가 실수를 할 꺼 같아서 두 번째 방법으로 바로 구현을 해봤고 코드는 다음과 같다.
n
,m
,k
그리고arr
변수에 기본적인 입출력을 받는다.sorted_arr
에 내림차순으로 정렬된 리스트를 저장한다.div_num
에 더해지는 횟수인M
과K
를 나눈 몫을 저장한다.- 3번에서 구한
div_num
값에sorted_arr[0](가장 큰 값)
와k
를 곱한 값(가장 큰 수를 K번 더한 값)
을 곱해서 그 값을 ans에 더한다.- 결국 가장 큰 수가 K번 더해지고 다음으로 큰 수가 1번 더해지는 과정이 반복되기 때문에 가장 큰 수가 K번 만큼 얼마나 더 해질 수 있는지에 대한 값이 div_num이고 그 값과 곱한다.
- ans를 출력한다.
Solution #1
책에서 제공되는 정답의 첫 번째는 위에서 설명한 단순하게 구현하는 방법이다.
무한루프를 돌면서 K번 만큼 가장 큰수를 더하고 그 다음 큰 수를 1번 더하고를 M이 0이될 때까지 반복하는 로직이다.
n, m, k = map(int, input().split())
data = list(map(int, input().split()))
data.sort()
first = data[n-1]
second = data[n-2]
ans = 0
while True:
for i in range(k):
if m == 0:
break
ans += first
m -= 1
if m == 0:
break
ans += second
m -= 1
print(ans)
Solution #2
내 정답 풀이와 같은 개념으로 접근한 풀이다.
내 풀이에서는 굳이 하지 않아도 될 내림차순 정렬을 해서 아래 코드처럼 그냥 일반 정렬을 하고 마지막 인덱스로 접근해서 그 수를 가장 큰수로 사용하면 더 좋을 것 같다.
n, m, k = map(int, input().split())
data = list(map(int, input().split()))
data.sort()
first = data[n-1]
second = data[n-2]
cnt = int(m / (k+1)) * k
cnt += m % (k+1)
result = 0
result += (cnt) * first
result += (m - cnt) * second
print(result)
'Algorithm' 카테고리의 다른 글
[Python] 숫자 카드 게임 (0) | 2022.06.25 |
---|