🧡 문제 : 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 가 비었다고 하는 에러의 굴레에서 벗어나질 못했음 ..
기. 억. 해.
'알고리즘 > 프로그래머스 연습문제' 카테고리의 다른 글
[Python/프로그래머스] 이진 변환 반복하기 - level 2 (2) | 2022.11.04 |
---|---|
[Python/프로그래머스] 올바른 괄호 - level 2 (0) | 2022.11.03 |
[Python/프로그래머스] JadenCase 문자열 만들기 - level 2 (0) | 2022.10.28 |