문제

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문이 가능하도록 만든게 인상적이다.

댓글남기기