[JavaScript][Programmers] 최소직사각형

조준형·2021년 9월 27일
0

Algorithm

목록 보기
140/142
post-thumbnail

🔎 최소직사각형

❓ 문제링크

https://programmers.co.kr/learn/courses/30/lessons/86491

📄 제출 코드

function solution(sizes) {
  let w = sizes.map(el => el[0]);
  let h = sizes.map(el => el[1]);
  const len = sizes.length;

  for (let i = 0; i < len; i++) {
    if (w[i] < h[i]) {
      let tmp = w[i];
      w[i] = h[i];
      h[i] = tmp;
    }
  };
  const maxW = Math.max(...w);
  const maxH = Math.max(...h);
  
  const answer = maxW * maxH;
  return answer;
}
// let sizes = [[60, 50], [30, 70], [60, 30], [80, 40]]
let sizes = [[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]];
console.log(solution(sizes));

추석 + 이사준비 + 퀘이사사용해보기를 하느라 알고를 되게 오랜만에 푼다.
이번문제는 8주차 위클리
직원들의 명합 [w,h]를 주고 모든 명함을 담을 수 있는 최소 크기의 지갑을 구하는 문제이다.
처음엔 그냥 무지성으로 문제설명대로 최대값을 구하고, 그다음 가장 큰 숫자의 w와 h를 바꿔서 곱한 값을 출력했다.
당연하게도 첫번째 테스트케이스만 통과하고 나머지는 다 틀렸다.

이제 어떻게 찾을까 생각해봤다.
두번째 테스트 케이스로 어떻게 하면 최대가 나올까 고민해보다가 그냥 w가 h보다 작으면 두개를 바꿔서 w의 최대값을 구하고, h의 최대값을 구해 곱하면 답이 나왔다.

🎲 다른 코드

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을 이용하여 rotated라는 새로운 배열을 만드는데 이때 삼항연산자를 이용해 내가 했던 방법을 한줄로 적용한게 인상적이였다.

profile
깃허브 : github.com/JuneHyung

0개의 댓글