programmers

[Programmers Level 1 완전탐색] 최소직사각형 Javascript

냠냠맨 2022. 12. 8. 02:19

문제정보

 

 

가로길이,세로길이가 담긴 배열로 이루어진 2차원 배열이 주어지는데모든 명함을 수납할 수 있는 지갑을 만들어야하는군요그런데 2번명함같이 세로가 긴 명함은 가로로 눕혀 수납할 수 있다고 합니다.

 

그래서 저는 모든 배열을 내림차순으로 정렬시켜서 푸는 방법을 생각했습니다.

 


 

예시

 

sizes	result
[[60, 50], [30, 70], [60, 30], [80, 40]]	4000
[[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]]	120
[[14, 4], [19, 6], [6, 16], [18, 7], [7, 11]]	133

 

정답은 직사각형의 넓이 형태로 반환하면 되는군요


 

나의풀이

 

function solution(sizes) {
    let row = []
    let column = []
    
    sizes.forEach(ele => {
                   
    let sorter = ele.sort((a,b) => b - a)
    row.push(sorter[0])
    column.push(sorter[1])
    })
    
    return Math.max(...row) * Math.max(...column)
}

 

변수를 좀 더 적게 선언하고 풀 방법이 있을 것 같은데 일단은 위와 같이 구현했습니다.forEach를 통해 각 요소에 접근한다음 sort를 통해 정렬을 해줬습니다.이때 sort()는 내림차순으로하든 오름차순으로하든 상관없겠네요

 

정렬시켜준다음 각 요소를 row와 column에 push해주고 두 배열의 최댓값끼리 곱하면그게 모든 명함을 수납할 수 있는 지갑의 크기일것입니다.

 

아쉬운 건 변수를 불필요하게 선언하지 않았나 하는 것이었습니다.


 

다른사람의 풀이

 

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

 

 

map을 이렇게 사용하면 2차원배열에도 사용할 수 있군요... map에 삼항연산자를 이용해서

정렬을 시켜준다음 forEach로 max값을 찾아줬네요

 

반응형