새벽까지
article thumbnail

[level 2] 최솟값 만들기 - 12941

문제 링크

 

프로그래머스

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

programmers.co.kr

성능 요약

메모리: 10.1 MB, 시간: 0.41 ms

구분

코딩테스트 연습 > 연습문제

채점결과

Empty

문제 설명

길이가 같은 배열 A, B 두개가 있습니다. 각 배열은 자연수로 이루어져 있습니다.
배열 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱합니다. 이러한 과정을 배열의 길이만큼 반복하며, 두 수를 곱한 값을 누적하여 더합니다. 이때 최종적으로 누적된 값이 최소가 되도록 만드는 것이 목표입니다. (단, 각 배열에서 k번째 숫자를 뽑았다면 다음에 k번째 숫자는 다시 뽑을 수 없습니다.)

예를 들어 A = [1, 4, 2] , B = [5, 4, 4] 라면

  • A에서 첫번째 숫자인 1, B에서 첫번째 숫자인 5를 뽑아 곱하여 더합니다. (누적된 값 : 0 + 5(1x5) = 5)
  • A에서 두번째 숫자인 4, B에서 세번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 5 + 16(4x4) = 21)
  • A에서 세번째 숫자인 2, B에서 두번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 21 + 8(2x4) = 29)

즉, 이 경우가 최소가 되므로 29를 return 합니다.

배열 A, B가 주어질 때 최종적으로 누적된 최솟값을 return 하는 solution 함수를 완성해 주세요.

제한사항
  • 배열 A, B의 크기 : 1,000 이하의 자연수
  • 배열 A, B의 원소의 크기 : 1,000 이하의 자연수
입출력 예
A B answer
[1, 4, 2] [5, 4, 4] 29
[1,2] [3,4] 10
입출력 예 설명

입출력 예 #1
문제의 예시와 같습니다.

입출력 예 #2
A에서 첫번째 숫자인 1, B에서 두번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 4) 다음, A에서 두번째 숫자인 2, B에서 첫번째 숫자인 3을 뽑아 곱하여 더합니다. (누적된 값 : 4 + 6 = 10)
이 경우가 최소이므로 10을 return 합니다.

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges


🚫 TRY 01

def solution(A,B):
    answer = 0
    for i in range(len(A)):
        answer+=max(A) * min(B)
        del A[A.index(max(A))]
        del B[B.index(min(B))]
    return answer

 

 

큰 값과 작은 값들을 직접 찾아서 곱하고 제거하는 방식을 사용하였는데 문제는 모두 맞지만 효율성테스트에서 시간이 모두 안맞았다.

함수 시간복잡도 내용
a.index(elem) O(n) elem 리스트 전체를 탐색
min(a), max(a) O(n) 최솟값/최댓값 전체를 선형 탐색

위 함수는 전체 4n이 나온다.



🔑 Solution 🔑

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

시간 복잡도를 생각하여 sort함수를 사용하여 해결하였다.

 

함수 시간복잡도 내용
a.sort() O(NlogN) 팀소트 알고리즘 (정렬되어있으면 비교하지않음)
a.reversed() O(1) 이터레이터 객체를 생성한다 반환한다
a.reverse() O(n) 리스트에서 모든 배열을 뒤바꾼후 반환한다.

 

 

GitHub - SeokJuGo/Studing_CodingTest: CodingTestPractice

CodingTestPractice. Contribute to SeokJuGo/Studing_CodingTest development by creating an account on GitHub.

github.com

 

profile

새벽까지

@GoS

좋아요❤️ 구독👍🏻 감사합니다!