https://programmers.co.kr/learn/courses/30/lessons/86491
명함을 만들어보자
function solution(sizes) {
//sizes의 하나의 배열size들에서 계속 갱신할 길이
//하나뽑고 시작
let size = sizes.pop();
let bigSize = 0;
let smallSize = 0;
//명함 긴쪽,짧은쪽 으로 통일하기 긴쪽=bigSize,짧은 쪽=smallSize
if (size[0] >= size[1]) {
bigSize = size[0];
smallSize = size[1];
} else {
bigSize = size[1];
smallSize = size[0];
}
let maxBigSize = bigSize;
let maxSmallSize = smallSize;
while (sizes.length) {
//sizes의 한 배열의 긴쪽 = bigSize1,짝은쪽 = smallSize1
let bigSize1 = 0;
let smallSize1 = 0;
// sizes의 뒤에서 부터 배열하나 뽑음
let size1 = sizes.pop();
if (size1[0] >= size1[1]) {
bigSize1 = size1[0];
smallSize1 = size1[1];
} else {
bigSize1 = size1[1];
smallSize1 = size1[0];
}
maxBigSize = Math.max(maxBigSize, bigSize1);
maxSmallSize = Math.max(maxSmallSize, smallSize1);
}
return maxBigSize * maxSmallSize;
}
긴쪽 짧은쪽 맞추는 것을 한 함수로 표현하면 한 번만 쓰면 되기 때문에 중복을 없애보자
// 카드정렬함수
function cardSpin(size) {
let bigSize = 0;
let smallSize = 0;
if (size[0] >= size[1]) {
bigSize = size[0];
smallSize = size[1];
} else {
bigSize = size[1];
smallSize = size[0];
}
return [bigSize, smallSize]
}
function solution(sizes) {
//하나뽑고 시작
let size = sizes.pop();
const [bigSize, smallSize] = cardSpin(size);
let maxBigSize = bigSize;
let maxSmallSize = smallSize;
while (sizes.length) {
// sizes의 뒤에서 부터 배열하나 뽑음
let size1 = sizes.pop();
let [bigSize1, smallSize1] = cardSpin(size1);
maxBigSize = Math.max(maxBigSize, bigSize1);
maxSmallSize = Math.max(maxSmallSize, smallSize1);
}
return maxBigSize * maxSmallSize;
}
이것도 한줄로 표현할 수 있었네ㅋㅋ
function solution(sizes) {
const [hor, ver] = sizes.reduce(([h,v],[a,b])=> [Math.max(h,Math.max(a,b)),Math.max(v,Math.min(a,b))],[0,0] )
return hor* ver
}
reduce의 accumlator(첫번째 파라미터)가 현재값과 이전값을 비교할때도 쓰임이 가능하구나 라는 생각을 하게 만드는 풀이
이전값에 더하거나 빼는 것만 생각했는데 여기서는 Math.max나 Math.min으로 비교하면서 넣어주었다.