문제
자연수로 이루어진 길이가 같은 수열 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 1 : if index_A != index_A_2: break else: index_A_2 = random.randrange(len(A)) while 1 : 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([1143, 3370, 3406, 4127, 5865, 6092, 8381, 9240, 9515, 9945],[664, 889, 2888, 3434, 3974, 5197, 5440, 7641, 7970, 8047])) | 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으로 멋있게 다듬으면 이렇게 된다.
'Computer Science > Problem Solving' 카테고리의 다른 글
[tryhelloword]가운데 글자 가져오기 by 파이썬 (0) | 2017.08.15 |
---|---|
[tryhelloworld]소수 찾기 by파이썬 (0) | 2017.08.14 |
[tryhelloworld]피보나치의 수 by파이썬 (0) | 2017.08.14 |
[tryhelloworld] 같은 수는 싫어 by파이썬 (0) | 2017.08.14 |
[tryhelloword]level1 제일 작은 수 제거하기 by 파이썬 (0) | 2017.08.14 |