[프로그래머스] 코딩테스트 연습 - 최소직사각형 (javascript)

지미노·2022년 9월 13일
0

코딩테스트

목록 보기
38/40

제한사항
sizes의 길이는 1 이상 10,000 이하입니다.
sizes의 원소는 [w, h] 형식입니다.
w는 명함의 가로 길이를 나타냅니다.
h는 명함의 세로 길이를 나타냅니다.
w와 h는 1 이상 1,000 이하인 자연수입니다.



생각해본 풀이법.
1.큰 수가 앞으로, 작은 수가 뒤로 가도록 정렬을 해줘야 함. -> for문 사용
2. 최소공배수 구하는 공식으로 가로, 세로 각자 최소공배수를 만들어주는 식을 만듬
3. 가로의 최소공배수와 세로의 최소공배수를 곱해서 return



최소공배수 어떻게 구하더라.. 하고 고민하던 중 갑자기 유레카처럼 스쳐지나간 생각.

근데 최소공배수를 왜 구하지??????? 그냥 각 길이중에 가장 긴 길이 뽑아서 가로 세로 해주면 모든 명함이 들어가잖아?????

최최최종 풀이법
1. 큰 수가 앞으로, 작은 수가 뒤로 가도록 배열을 1차 정렬함 -> for문 사용
2. 각 원소들의 인덱스가 0 , 1인 애들끼리 새로 배열을 만듦 (인덱스 0배열, 인덱스 1배열)
3. 각 배열들을 sort 해서 맨 끝 인덱스 숫자끼리 곱해준다

그래서 만든 답안

function solution(sizes) {
    let size1 = [];
    let size2 = [];
    for(let i = 0; i < sizes.length; i++) {
       sizes[i].sort();
        size1.push(sizes[i][0])
        size2.push(sizes[i][1])
    };
    size1.sort((a, b) => b - a);
    size2.sort((a, b) => b - a);
    return size1[0]*size2[0]
}

띠용.... 정답률 무슨일........

아!!!!!!!

(최총답안)

function solution(sizes) {
    let size1 = [];
    let size2 = [];
    for(let i = 0; i < sizes.length; i++) {
       sizes[i].sort((a, b) => a - b);
        size1.push(sizes[i][0])
        size2.push(sizes[i][1])
    };
    size1.sort((a, b) => b - a);
    size2.sort((a, b) => b - a);
    return size1[0]*size2[0]

}

sort 위에 있는거 하나 정렬 빼먹음!

코드가 허접한지 1점... 또르르

리듀스와 Math.max&min 사용한 답안

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;
}

가독성 좋고 깔끌했던 답안

function solution(sizes) {
    const rotated = sizes.map(([w, h]) => w < h ? [h, w] : [w, h]);

    let maxSize = [0, 0];
    rotated.forEach(([w, h]) => {
        if (w > maxSize[0]) maxSize[0] = w;
        if (h > maxSize[1]) maxSize[1] = h;
    })
    return maxSize[0]*maxSize[1];
}

0개의 댓글