[프로그래머스] 최소직사각형 만들기

devCecy·2022년 3월 22일
0

알고리즘

목록 보기
2/5
post-thumbnail

프로그래머스 8주차 문제입니다.

문제

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

나의풀이

function solution(sizes) {
  var answer = 0;
  let arr = [];
  let minW = [];
  let minH = [];

    for(let i = 0; i <sizes.length; i++){
      sizes[i][0]>sizes[i][1] ? arr.push(sizes[i]) : arr.push([sizes[i][1],sizes[i][0]]);
    
    minW.push(arr[i][0]);
    minW.sort(function(a, b) { return b - a; });
    minH.push(arr[i][1]);
    minH.sort(function(a, b) { return b - a; });
  }
    return answer= minW[0]*minH[0];
}

이번에도 직관적으로 풀었다. 아직 뭔가 더 간단한 방법을 찾기보다 이해한 그대로 푸는것부터 시작해야겠다는 생각으로.

명함지갑에 명함의 가로 세로 방향을 바꿔 넣을 수 있다는 조건이 있다. 그래서 각 명함의 가로 세로 중 가장 큰사이즈를 가로로 몰주고, 더 작은 값을 세로로 몰아주었다.

그리고 몰아준 가로 사이즈중 가장 큰값 x 몰아준 세로 사이즈중 가장 큰값을 return 했다.

다른 분들의 풀이

역시 다른분들의 풀이를 보니 배울게 많았다. 그 중 몇가지를 뽑아왔다.

forEach 사용

이 코드로 배운점이 많았다.

arr.sort()는 원배열을 정렬한 후 그 값을 반환한다. MDN참고
for 문 대신 forEach문 사용, MDN참고
if(조건) 실행, 이렇게 사용할 수 있다는 것!
그리고 answer 마저도 삭제하고 return 값만 맞으면 되는구나도 배움!

function solution(sizes) {
    let w = 0;
    let h = 0;
    sizes.forEach(s => {
        const [a, b] = s.sort((a,b) => a-b); //오름차순 정리
        if (a > h) h = a;
        if (b > w) w = b;
    });

    return w * h;
}

map 사용

이건 위 forEach를 사용한것 과 map을 사용한 부분까지는 비슷하다. 대신 sort를 내림차순으로 해주었고, Math.max()로 가장 큰 수를 뽑았다.

Math.max()는 입력받은 값에서 가장 큰값을 반환한다. MDN참고

function solution(sizes) {
     sizes.map((item) => item.sort((a, b) => b - a)) //내림차순으로 원배열 정렬
    let hMax = Math.max(...sizes.map((item)=> item[0])) //Math.max()에 배열을 사용하기 위해서 ...으로 배열을 복사해줌!
    let wMax = Math.max(...sizes.map((item) => item[1]));
    return hMax * wMax;
}

reduce 사용

reduce 다시한번 짚어보기

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;
}
profile
🌈그림으로 기록하는 개발자🌈

0개의 댓글