[Programmers] 최소 직사각형

Jay Mild Lee·2022년 11월 22일
0

Algorithm Problems

목록 보기
7/16

I. 최소 직사각형

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

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 함수를 완성해주세요.

2. 제한 사항

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

3. 풀이

각 명함의 가로, 세로 길이를 받아 모든 명함들을 커버할 수 있는 최소의 직사각형을 찾는 문제.
(가로, 세로) 형식으로 주어지는 input을 가로와 세로의 크기를 비교해 (bigger, smaller)로 변환하고, 큰 값들 중 최댓값과 작은 값들 중 최솟값을 곱해 구했다.

결론적으로, 다음과 같이 진행했다.
1. 배열의 행 별로 열의 크기를 각각 비교하고, 큰 수는 arr[i][0]에, 작은 수는 arr[i][1]에 저장한다.
2. [i][0] 중 최댓값과, [i][1] 중 최댓값을 곱한다.

4. 소스 코드

class Solution {
    public int solution(int[][] sizes) {
        int answer = 0;
        for (int i = 0; i < sizes.length; i++) {
            if(sizes[i][0] < sizes[i][1]){
                int tmp = sizes[i][0];
                sizes[i][0] = sizes[i][1];
                sizes[i][1] = tmp;
            }
        }
        int max_w = 0;
        int max_h = 0;
        for (int i = 0; i < sizes.length; i++) {
            if (sizes[i][0] > max_w){
                max_w = sizes[i][0];
            }
        }
        for (int i = 0; i < sizes.length; i++) {
            if (sizes[i][1] > max_h){
                max_h = sizes[i][1];
            }
        }
        answer = max_w*max_h;
        return answer;
    }
}

0개의 댓글