[프로그래머스]Level.1 최소 직사각형

전현정·2021년 11월 21일
0

알고리즘

목록 보기
3/18
post-thumbnail

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

문제설명

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

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

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

제한사항

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

입출력 예

입출력 예#1
명함들을 적절히 회전시켜 겹쳤을 때, 3번째 명함(가로: 8, 세로: 15)이 다른 모든 명함보다 크기가 큽니다. 따라서 지갑의 크기는 3번째 명함의 크기와 같으며, 120(=8 x 15)을 return 합니다.

입출력 예 #2
명함들을 적절히 회전시켜 겹쳤을 때, 모든 명함을 포함하는 가장 작은 지갑의 크기는 133(=19 x 7)입니다.

문제 이해

명함을 넣을 수 있는 최소 크기를 구해야한다
이를 위해, 무조건 가로 값이 크도록 명함을 재배열시켜준다.

모든 명함들을 가로가 길고, 세로가 짧은 방향으로 놔두고, 이 상태에서
가로의 최댓값과 세로의 최댓값을 구해 곱하는 문제

문제풀이1

1.map()메서드를 이용해 가로, 세로의 값을 비교하여 둘 중 큰 값을 배열의 앞으로 배치시킴.
2. Math.max()를 이용해 배열의 가장 큰 숫자를 반환해 값을 곱한다.

function solution(sizes){
	const lower = [];
  	const higher = [];
  	sizes.map(([s0,s1]) => {
      if(s0 > s1){
        higher.push(s0);
        lower.push(s1);
      }else{
        lower.push(s0);
        higher.push(s1);
      }
    })
  return Math.max(...higher) * Math.max(...lower);
}
profile
꾸준하기 위해 기록하는 개발자의 개발 일기

0개의 댓글

관련 채용 정보