dmswl

[프로그래머스 LV2] 최솟값 만들기 본문

코테 공부/알고리즘

[프로그래머스 LV2] 최솟값 만들기

dmswl. 2023. 4. 13. 13:04

문제 이해

 

만약, 배열 A의 최솟값 < 배열 B의 최솟값:

     배열 A의 최솟값이랑 배열 B의 최댓값을 곱해줘야 함.

 

만약, 배열 A의 최솟값 > 배열 B의 최솟값:

     배열 B의 최솟값이랑 배열 A의 최댓값을 곱해줘야 함.

 

문제 풀이 방향

 

1. A에서 최솟값 찾고 B에서 최솟값 찾아서 비교

2. 둘 중 더 작은 최솟값을 가지는 배열에서 최솟값을 선택하고, 나머지 배열에서 최댓값 선택

3. 꺼낸 값은 지우기 - 여기서 내림차순으로 정렬한 데크로 구현.

(만약 최솟값을 안꺼냈다면, 다시 append 하기 -> 방금 꺼낸 자리에 append 해야하므로 내림차순 정렬 & pop() 이용)

4. 1,2,3 과정 반복

 

from collections import deque

def solution(A,B):
    answer = 0
    # 0. 내림차순으로 정렬한 deque 만들기
    A.sort()
    B.sort()
    A = deque(A[::-1])
    B = deque(B[::-1])
    
    # 1. A에서 최솟값 찾고 B에서 최솟값 찾아서 비교
    a = A.pop() 
    b = B.pop()
    
    while A:
        if a < b:
            B.append(b) # 최솟값 아닌 원소는 다시 집어넣기
            answer += a*B[0]    # 최솟값과 최댓값 곱해서 누적합하기

        else:
            A.append(a)
            answer += b*A[0]
        

    return answer

너무 복잡하게 품 -> 시간 초과

 

단순히 한 배열은 오름차순, 한 배열은 내림차순해서 정렬한 다음 같은 인덱스끼리 곱해주면 됨.

 

def solution(A,B):
    
    return sum([n_pair[0] * n_pair[1] for n_pair in zip(sorted(A), sorted(B, reverse=True))])
Comments