입력 예시가 있는 문제들이 있는 경우는 input 값을 입력하는 형태로 구성해주면 된다.
특히나 input값을 가지고 연산이 필요한 경우는 map 함수를 통해 int, float 등 필요한 숫자형태로 변형해준다.
만약 배열의 형태로 가져오고 싶다면 list와 map 함수를 사용한다.
[예시 코드]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# input 값으로 받은 값들은 정수형으로 반환
# 각 입력값들은 공백으로 구분하며, 각각 n, m, k라는 변수에 할당됨
n, m, k = map(int, input().split())
# 숫자 여러개를 입력받아 배열 반환
# 입력값들은 공백으로 구분하고, 정수로 변환 후 배열에 넣음
data = list(map(int, input().split()))
# map 함수를 이용하지 않는다면? 반복문으로 처리하서 일일이 append 해줘야하는데 비효율적임
# map 함수의 다른 사용법
# map(함수, 배열)
# 배열의 요소 하나씩 함수를 적용하여 반환
def func_pow(x):
return pow(x, 5)
result = list(map(func_pow, [1,2,3,4,5]))
[문제풀이]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# N, M, K 공백으로 구분하여 입력받기
n, m, k = map(int, input().split())
# N개의 수를 공백으로 구분하여 입력받기
arr = list(map(int, input().split()))
# 오름차순 정렬 => 내림차순 arr.sort(reverse=True)
arr.sort()
# 가장 큰수와 두번째로 큰수 가져오기
first = arr[n-1]
second = arr[n-2]
# 초기값 설정
result=0
# 반복문
while True:
# 가장 큰수 k번 더하기
for _ in range(k):
if m == 0:
break
result += first
m -= 1
# 두번째로 큰수 한번 더하기
if m == 0:
break
result += second
m -= 1
print(result)
결국 수열 문제와 같은 형태라고 할 수 있다.
가장 큰수가 K번 반복되고 두번째로 큰수가 한번 나오는 형태의 수열인 것이다. EX) 6 6 6 5 6 6 6 5 6 6 6 5 ….
그럼 수열이 반복되는 횟수와 수열의 길이만 안다면 또 다른 형태의 함수로 구현이 가능해보인다.
n = 5 , m = 8, k = 3
2 4 5 4 6
5 6
(6 6 6 5), (6 6 6 5)
반복되는 수열의 길이는 k+1
m을 k+1로 나눈 몫 만큼 반복 된다 이를 수식으로 나타내면 수열의 패턴이 반복되는 횟수는 m//(k+1)
이를 통해서 새로운 함수를 작성해보면,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# N, M, K 공백으로 구분하여 입력받기
n, m, k = map(int, input().split())
# N개의 수를 공백으로 구분하여 입력받기
arr = list(map(int, input().split()))
# 오름차순 정렬 => 내림차순 arr.sort(reverse=True)
arr.sort()
# 가장 큰수와 두번째로 큰수 가져오기
first = arr[n-1]
second = arr[n-2]
# 가장 큰수가 더해지는 횟수
count = (m//(k+1))*k
count += m%k
result = 0
result += count*first
result += (m-count)*second
print(result)
m이 k+1로 나누어 떨어지는 경우만 고려했기 때문에 완벽한 함수가 아니다.
m이 k+1로 나누어 떨어지지 않는 다는 것은 그 나머지 만큼 가장 큰수를 추가로 더한다는 것을 의미한다.
이는 가장 큰수를 총 몇번 더하는지에 대한 수식이 count = (m//(k+1))*k + m%(k+1)로 바뀐다.
이를 반영해 다시 함수를 짜면,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# N, M, K 공백으로 구분하여 입력받기
n, m, k = map(int, input().split())
# N개의 수를 공백으로 구분하여 입력받기
arr = list(map(int, input().split()))
# 오름차순 정렬 => 내림차순 arr.sort(reverse=True)
arr.sort()
# 가장 큰수와 두번째로 큰수 가져오기
first = arr[n-1]
second = arr[n-2]
# 가장 큰수가 더해지는 횟수
count = (m//(k+1))*k + m%(k+1)
result = 0
result += count*first
result += (m-count)*second
print(result)