-
20. 최솟값 만들기코딩 테스트/Level 2 2020. 8. 3. 14:31반응형
https://programmers.co.kr/learn/courses/30/lessons/12941
연습문제 4891명 완료
쉬운 편입니다.
곱하고 더해서 가장 작은 수를 만들어야 되기 때문에
작은 수와 큰 수를 조합해야 가장 작은 수를 만들 수 있습니다.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#_1, https://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=2359def 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; } }
반응형