ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20. 최솟값 만들기
    코딩 테스트/Level 2 2020. 8. 3. 14:31
    반응형

    https://programmers.co.kr/learn/courses/30/lessons/12941

    연습문제 4891명 완료

    쉬운 편입니다. 

    곱하고 더해서 가장 작은 수를 만들어야 되기 때문에
    작은 수와 큰 수를 조합해야 가장 작은 수를 만들 수 있습니다. 

     

    코딩테스트 연습 - 최솟값 만들기

    길이가 같은 배열 A, B 두개가 있습니다. 각 배열은 자연수로 이루어져 있습니다. 배열 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱합니다. 이러한 과정을 배열의 길이만큼 반복하며, 두 수를 곱

    programmers.co.kr

    Python

    def solution(A, B):
        A.sort()
        B.sort(reverse=True)
        s=0
        for i in range(len(A)):
            s += A[i]*B[i]
        return s
    테스트 1 〉	통과 (0.35ms, 10.9MB)
    테스트 2 〉	통과 (0.34ms, 11MB)
    테스트 3 〉	통과 (0.35ms, 11MB)
    테스트 4 〉	통과 (0.32ms, 10.9MB)

    파이썬의 내장 함수 중 zip이 있습니다. https://wikidocs.net/32#zip

    def solution(A, B):
        answer = 0
        for i, j in zip(sorted(A), sorted(B, reverse=True)):
            answer += i * j
        return answer
    테스트 1 〉	통과 (0.33ms, 10.9MB)
    테스트 2 〉	통과 (0.33ms, 10.9MB)
    테스트 3 〉	통과 (0.31ms, 10.9MB)
    테스트 4 〉	통과 (0.43ms, 10.9MB)

    제너레이터 표현식(또는 리스트 컴프리헨션)과 sum함수를 사용하면 한 줄로 줄일 수 있습니다.

    https://wikidocs.net/22#_1https://thebook.io/006764/ch01/09/

    def solution(A, B):
        return sum(i * j for i, j in zip(sorted(A), sorted(B, reverse=True)))
    테스트 1 〉	통과 (0.34ms, 10.8MB)
    테스트 2 〉	통과 (0.33ms, 10.9MB)
    테스트 3 〉	통과 (0.34ms, 10.9MB)
    테스트 4 〉	통과 (0.32ms, 10.8MB)

    파이썬의 제너레이터 표현식(또는 리스트 컴프리헨션)은 함수형 프로그래밍을 가능하게 해 줍니다.
    좀 더 함수형 프로그래밍스럽게 작성한다면 다음과 같겠죠. 
    제너레이터 표현식 대신 map, 과 lambda를 이용하면 됩니다. 
    https://wikidocs.net/32#map , https://dojang.io/mod/page/view.php?id=2359

    def solution(A, B):
        return sum(map(lambda x: x[0] * x[1], zip(sorted(A), sorted(B, reverse=True))))
    테스트 1 〉	통과 (0.37ms, 11MB)
    테스트 2 〉	통과 (0.38ms, 10.9MB)
    테스트 3 〉	통과 (0.38ms, 10.9MB)
    테스트 4 〉	통과 (0.36ms, 10.8MB)

    보통 함수형 프로그래밍은 앞에서 읽기 시작하면 되지만, 파이썬에서는 안에서부터 읽으면 됩니다. 

    다들 속도는 비슷비슷 오차 범위 안이군요. 

    C#

    using System;
    
    public class Solution
    {
        public int solution(int[] A, int[] B)
        {
            Array.Sort(A);
            Array.Sort(B, (a, b) => b - a);
            int answer = 0;
            for (int i = 0; i < A.Length; i++)
            {
                answer += A[i] * B[i];
            }
            return answer;
        }
    }

    JS

    function solution(a, b) {
        a.sort((x, y) => x - y)
        b.sort((x, y) => y - x)
        let sum = 0
        for (let i = 0; i < a.length; i++) {
            sum += a[i] * b[i]
        }
        return sum
    }
    function solution(a, b) {
        a.sort((x, y) => x - y)
        b.sort((x, y) => y - x)
        return a.map((e, i) => e * b[i]).reduce((x, y) => x + y)
    }

    자바스크립트는 zip이 없는 대신 map의 index를 이용해서 zip을 처리할 수 있습니다. 
    sum은 reduce를 이용하면 됩니다. 

    solution = (a, b) => ([...a].sort((x, y) => x - y)).map((e, i) => e * [...b].sort((x, y) => y - x)[i]).reduce((x, y) => x + y)

    sort 마저 인라인으로 처리하고 싶다면.. [...a]를 이용하면 됩니다. 

    Java

    import java.util.Arrays;
    
    class Solution {
        public int solution(int[] a, int[] b) {
            Arrays.sort(a);
            Arrays.sort(b);
            int answer = 0;
            for (int i = 0; i < a.length; i++) {
                answer += a[i] * b[a.length - i - 1];
            }
            return answer;
        }
    }
    반응형
Designed by Tistory.