알고리즘/프로그래머스 연습문제

[Python/프로그래머스] 최솟값 만들기 - level 2

수디sudy 2022. 11. 2. 15:14

🧡 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/12941

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

🧡 첫 번째 풀이 ( 정확성 : 정답, 효율성 : 실패 )

 

1. (A 리스트에서 가장 큰 값 * B 리스트에서 가장 작은 값) 들의 합이 최솟값이다

2. max(), min(), remove() 함수를 이용해 각각 리스트에서의 최댓값, 최솟값을 구한 후 지우는 걸 반복

 

처음엔 이런 로직으로 구현했으나,,

 

def solution(A,B):
    answer = 0
    
    A1 = A2 = A.copy()

    while len(A1) > 0:
        a = max(A1)
        b = min(B1)
        answer += a*b
        A1.remove(a)
        B1.remove(b)


    return answer

지난번에 알아냈던 반복문 안에서 max(), min(), sum() 등의 함수를 계속 사용하면 시간초과가 잘 난다는 것

이거 또 까먹고 저렇게 풀었다다가 정확성만 다 맞고 효율성은 다 틀렸다 ㅎ..

 

🧡 두 번째 풀이(정답)

def solution(A,B):
    answer = 0
    
    A1 = A.copy()
    B1 = B.copy()
    
    A1.sort()
    B1.sort(reverse=True)
    
    for i in range(0, len(A)):
        answer += A1[i]*B1[i]

    return answer

 

그래서 A는 오름차순 정렬, B는 내림차순 정렬을 해서 for문을 돌면서 같은 인덱스끼리 곱해주는 식으로 

코드를 수정했다.

 

 

 

 

🧡 알아두고 외울 것

  • 얕은 복사
listA = [1,2,3]

listA1 = listA2 = listA

python 에서 이렇게 리스트를 복사하면 '얕은 복사' 로 사실 리스트는 1개이고 그 주소값을 가리키는 이름이 여러개 되는 것이다. 

(C++에서 pointer, call by value 등과 비슷한 개념)

 

그래서 listA1 에서 원소 하나를 삭제하면 listA2 에서도 자동으로 똑같은 원소가 삭제된다.

 

  • 깊은 복사
listA = [1,2,3]

listA1 = listA.copy()

따라서 copy() 함수를 이용해야 1,2,3 원소를 가진 별개의 리스트가 새로 만들어지면서 복사가 되는 것이다.

 

 

 

이거 까먹구 첫 번째 풀이에서 그냥 리스트 복사했다가 자꾸 min 함수 안에 argument 가 비었다고 하는 에러의 굴레에서 벗어나질 못했음 ..

기. 억. 해.