Skip to content

Latest commit

 

History

History
96 lines (66 loc) · 3.59 KB

20221211-lv-1-최소 직사각형.md

File metadata and controls

96 lines (66 loc) · 3.59 KB

https://school.programmers.co.kr/learn/courses/30/lessons/86491?language=javascript

기존에 풀다가 만 풀이가 있어서 완성 시킨 다음에 새로 풀어봤어요. 아마 시기적으로 6개월 차이가 나는데,,,, 그 때랑 지금이랑 조금 달라졌네요.

6개월 전 : forEach 마니아,,, 지금 : 되도록 일반 반복문 사용,,,

forEach가 반복문 중단(break, continue)이 불가능한게 성능상 단점으로 작용하는 경우가 많아서 안쓰고 있습니다.

문제 설명

명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.

아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.

| 명함 | 번호 | 가로 길이 | 세로 길이 | | 1 | 60 | 50 | | 2 | 30 | 70 | | 3 | 60 | 30 | | 4 | 80 | 40 |

가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다.

모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.

예전 풀이

O(n)이기는 한데, 반복문이 세번 돌았습니다.

function solution(sizes) {
    
    return sizes
        .map(v => v.sort((a, b) => b - a))
        .reduce(
            ([bef_l, bef_r], [curr_l, curr_r], ..._) => 
            [Math.max(bef_l, curr_l), Math.max(bef_r, curr_r)],
            [0, 0]
        ).reduce(
            (left, right) => left * right
        );
    
}

지금 풀이 A

동일한 O(n)이면서 반복문은 1번만 돌았습니다.

function solution(sizes) {
    
    let top_width = 0;
    let top_height = 0;
    for (const [left, right] of sizes) {
    
        const now_width = Math.max(left, right);
        const now_height = Math.min(left, right);
        
        top_width = Math.max(top_width, now_width);
        top_height = Math.max(top_height, now_height);
    }
    
    return top.width * top.height;
    
}

지굼 풀이 B

동일한 O(n)에 반복문 한 개만 돌렸습니다. 기존에는 그냥 원시값(Primitive Type)을 사용했는데, 여기서는 객체 사용했습니다.

최대 카드와 현재 카드는 모두 같은 속성(widht, height)을 가지고 있어서 조금 더 읽기 쉬워지는 것 같습니다. 객체 생성 비용이 발생하기는 하지만, 크게 성능에 영향을 주지는 않을 것 같습니다.

실제로 대다수는 반복문이 얼마나 돌았는가 (이상적인 상황 및 최악의 상황)이 주요 관건입니다.

function solution(sizes) {
    
    const top = { width: 0, height: 0 };
    for (const [left, right] of sizes) {
        const now = {
            width: Math.max(left, right),
            height: Math.min(left, right)
        }
        
        top.width = Math.max(top.width, now.width);
        top.height = Math.max(top.height, now.height);
    }
    
    return top.width * top.height;
    
}