Covenant

문제

자연수로 이루어진 길이가 같은 수열 A,B가 있습니다. 최솟값 만들기는 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱한 값을 누적하여 더합니다. 이러한 과정을 수열의 길이만큼 반복하여 최종적으로 누적된 값이 최소가 되도록 만드는 것이 목표입니다.


예를 들어 A = [1, 2] , B = [3, 4] 라면

1. A에서 1, B에서 4를 뽑아 곱하여 더합니다.

2. A에서 2, B에서 3을 뽑아 곱하여 더합니다.


수열의 길이만큼 반복하여 최솟값 10을 얻을 수 있으며, 이 10이 최솟값이 됩니다.

수열 A,B가 주어질 때, 최솟값을 반환해주는 getMinSum 함수를 완성하세요.



나의 풀이



삽질의 산물

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
31
32
33
34
35
36
import random
 
def getMinSum(A,B):
    tmp = []
    answer = 0
    
    for i in range (5000):
        index_A = random.randrange(len(A))
        index_B = random.randrange(len(B))
        result1 = A[index_A] * B[index_B]
        
        index_A_2 = random.randrange(len(A))
        index_B_2 = random.randrange(len(B))
        
        while :
            if index_A != index_A_2:
                break
            else:
                index_A_2 = random.randrange(len(A))
                
        while :
            if index_B != index_B_2:
                break
            else:
                index_B_2 = random.randrange(len(B))        
        
        result2 = A[index_A_2] * B[index_B_2]
        
        tmp.append(result1+result2)
        
    return min(tmp)
 
#아래 코드는 출력을 위한 테스트 코드입니다.
 
print(getMinSum([1143337034064127586560928381924095159945],[66488928883434397451975440764179708047]))
 
cs

 한번 재미있게 풀어 본다고 random함수를 써 봤다. 리스트가 커지면 정확한 값이 안 나오는지 알았지만 충분하다고 생각하는만큼 반복문(5000번)정도 시행한다. 그리고 중복되지 않는 인덱스 범위 한해서 A리스트와 B리스트끼리 곱을 한다. 그리고 이 합이 가장 작은 것을 찾는 것이다. 그런데 나는 이 문제를 읽었을 때 A에서 원소 2개 B에서 원소 2개 골라서 하는 건 줄 알았다. 그래서 망했다.... 하지만 좋은 시도여서 담았다.



1
2
3
4
5
6
7
8
9
10
11
def getMinSum(A,B):
    A.sort()
    B.sort(reverse = True)
    result = 0
    for i in range (len(A)):
        result = result + A[i] * B[i]
    
    return result
 
 
print(getMinSum([1,2],[3,4]))
cs

 문제에서 원하는 결과를 리턴하려면 A는 오름차순으로 B는 내림차순으로 정렬하고, 이들을 각각 곱해서 다 더해 버리면 된다. 간단하다.



다른 사람의 풀이

def getMinSum(A, B): return sum([a * b for a, b in zip(sorted(A), sorted(B, reverse=True))]) # 아래 코드는 출력을 위한 테스트 코드입니다. print(getMinSum([1, 2], [3, 4]))

 내가 푼 것을 zip으로 멋있게 다듬으면 이렇게 된다.