문제
https://programmers.co.kr/learn/courses/30/lessons/12941?language=python3
풀이
곱셈의 특성을 생각하면 어떻게 접근해야할지 파악이 가능한 문제다.
최대값은 될 수 있는한 최소값으로 곱하고, 최소값을 최대값으로 곱해줘야
누적결과가 최소로 나온다.
def solution(A,B):
answer = 0
for i in range(len(A)) :
answer += min(A) * max(B)
A.remove(min(A))
B.remove(max(B))
return answer
# 효율성 테스트
테스트 1 〉 실패 (시간 초과)
테스트 2 〉 실패 (시간 초과)
테스트 3 〉 실패 (시간 초과)
테스트 4 〉 실패 (시간 초과)
답은 맞게 뽑았으나, 효율성에서 완전히 탈락이다.
A에선 최소값, B에선 최대값을 뽑으니까 정렬 전처리 후 다시 해보자.
def solution(A,B):
answer = 0
A.sort(reverse=True)
B.sort()
for i in range(len(A)) :
answer += A.pop() * B.pop()
return answer
# 효율성 테스트
테스트 1 〉 통과 (0.48ms, 10.1MB)
테스트 2 〉 통과 (0.57ms, 10.2MB)
테스트 3 〉 통과 (0.48ms, 10.3MB)
테스트 4 〉 통과 (0.43ms, 10.1MB)
통과!
더 나은 풀이
def getMinSum(A,B):
return sum(a*b for a, b in zip(sorted(A), sorted(B, reverse = True)))
알고리즘은 완전히 동일하지만, a와 b를 정렬과 동시에 zip으로 묶으면서
한 줄 for문이 가능하도록 만든게 인상적이다.
댓글남기기