코딩테스트/99클럽

99클럽 코테 스터디 16일차 TIL - 최소 직사각형

꼽파 2024. 8. 6. 16:49


최소 직사각형

출처 : 프로그래머스 Lv.1

문제 설명

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

제한사항

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

입출력 예

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) {
    // 가로 세로를 비교한다
    // 더 큰 값을 가로로 두고, 가로를 기준으로 내림차순 정렬한다
    // 세로 길이 중에서 가장 큰 값을 선택한다
    const widthArr = [];  // 가로 길이
    const lengthArr = [];  // 세로 길이
    
    for (let i = 0; i < sizes.length; i++) {
        let [num1, num2] = sizes[i]  // 구조분해 할당
        // 둘 중 더 큰 값이 가로 길이 배열로 들어감.
        // 더 작은 값은 세로 길이 배열로 들어감.
        if (num1 >= num2) {
            widthArr.push(num1)
            lengthArr.push(num2)
        } else {
            widthArr.push(num2)
            lengthArr.push(num1)
        }
    }
    
    // 가로 길이 배열의 최댓값과 세로 길이 배열의 최댓값을 곱한 면적
    return Math.max(...widthArr) * Math.max(...lengthArr);
}

 

파이썬

def solution(sizes):
    width_arr = []  # 가로 길이 배열
    length_arr = []  # 세로 길이 배열
    
    for size in sizes:
        num1, num2 = size  # 튜플을 언패킹
        # 두 값 중에서 큰 값은 가로 길이 배열에, 작은 값은 세로 길이 배열에 추가
        if num1 >= num2:
            width_arr.append(num1)
            length_arr.append(num2)
        else:
            width_arr.append(num2)
            length_arr.append(num1)
    
    # 최대 가로 길이와 최대 세로 길이를 곱하여 지갑의 크기 계산
    return max(width_arr) * max(length_arr)


자바스크립트 구조분해 할당

const array = [1, 2, 3];
const [a, b] = array; // a = 1, b = 2

const obj = { x: 10, y: 20 };
const { x, y } = obj; // x = 10, y = 20

 

파이썬 튜플 언패킹

tuple_example = (1, 2, 3)
a, b = tuple_example  # a = 1, b = 2

nested_tuple = (10, (20, 30))
x, (y, z) = nested_tuple  # x = 10, y = 20, z = 30

참고 : https://wikidocs.net/92538

728x90