이것이 코딩 테스트다 with Python
기출 : 2019국가 교육기관 코딩 테스트
Greedy알고리즘
문제
- 다양한 수로 이루어진 배열이 있을 때 주어진 수들을 M번 더하여 가장 큰 수를 만드는 법칙.
- 단, 배열의 특정한 인덱스(번호)에 해당하는 수가 연속해서 K번을 초과하여 더해질 수 없다.
입력 조건
- 첫째 줄에 N (2 ≤ N ≤ 1,000) , M (1 ≤ M ≤ 10,000) , K(1 ≤ K ≤ 10,000)의 자연수가 주어지며, 각 자연수는 공백으로 구분한다.
- 둘째 줄에 N개의 자연수가 주어진다. 각 자연수는 공백으로 구분한다. 단, 각각의 자연수는 1 이상 10,000 이하의 수로 주어진다.
- 입력으로 주어지는 K는 항상 M보다 작거나 같다.
출력 조건
- 첫째 줄에 큰 수의 법칙에 따라 더해진 답을 출력한다.
Solution
arraySize, addArray, repeat = map(int, input().split())
arrayData = list(map(int, input().split()))
arrayData.sort();
firstNumber = arrayData[arraySize-1]
secondNumber = arrayData[arraySize-2]
result =0
count = 1
for i in range(repeat):
if count != addArray:
result += firstNumber
count += 1
else:
result += secondNumber
count = 0
print(result)
풀이
입력받은 배열의 최댓값과 2번째로 큰 값을 구하여 총 K번의 덧셈 연산을 한다.
결괏값에 최댓값의 덧셈을 M번 반복해준 다음 2번째로 큰 값을 한번 더하여 연속으로 한 수를 M번 이상 연산하는 상황을 방지한다.
arraySize, addArray, repeat = map(int, input().split())
: 배열 크기, K번 연산, 같은 수를 M번 연산하는 수를 입력 받음arrayData = list(map(int, input().split()))
: 배열을 입력 받음arrayData.sort()
: 배열을 정렬firstNumber = arrayData[arraySize-1]
: 가장 큰 수를 구함secondNumber = arrayData[arraySize-2]
: 가장 큰 다음수를 구함count
: M번 반복되는 것을 체크하기 위해서 선언result
: 결괏값
for i in range(repeat):
if count != addArray:
result += firstNumber
count += 1
else:
result += secondNumber
count = 0
- count가 M이랑 같아지면 두 번째로 큰 수를 더해줘서 연속적으로 가장 큰 수를 더하지 않도록 한다.