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

이찬혁·2024년 6월 14일

알고리즘

목록 보기
68/72

프로그래머스 Lv1 - 최소직사각형 문제

프로그래머스 알고리즘 고득점 Kit 카테고리의 완전탐색 문제 중 레벨 1 최소직사각형 문제를 풀이했다.

처음에 문제 설명이 잘 이해가 안되어서 문제를 이해하는데에 시간을 꽤나 쓴 것 같다.
문제 설명 예제에서 2번 명함(가로: 30, 세로: 60)을 가로로 뒤집으면 최종적으로 80 x 50인 명함이 된다는데 왜 50이 되는지 이해가 안됐었는데 2번 명함을 뒤집으면 세로가 30이 되지만 최종적으로 세로 길이중 가장 긴 길이를 가지고 있는 1번 명함(세로: 50)이 있기 때문에 80 x 50이 된다는 것을 파악했다.

그렇다면,
가로 길이를 저장하는 인덱스에는 각 명함의 가로, 세로 길이 중 더 큰 길이를 넣고
세로 길이를 저장하는 인덱스에는 각 명함의 가로, 세로 길이 중 더 작은 길이를 넣어서
가로 길이를 저장하는 인덱스에서 가장 큰 값,
세로 길이를 저장하는 인덱스에서 가장 작은 값을 곱하면 정답이 되겠다라고 생각하여 풀이했다.

MinimumRectangle.java

package com.example.Programmers.Lv1;

/**
 * 프로그래머스 Lv1 - 최소직사각형
 * 완전탐색 문제 유형
 */
public class MinimumRectangle {
    public int solution(int[][] sizes) {
        int wMax = Integer.MIN_VALUE;
        int hMax = Integer.MIN_VALUE;

        // 명함 종류만큼 반복
        // 가로 길이에는 가로, 세로 중 가장 큰 값을 세로 길이에는 가로, 세로 중 가장 작은 값을 세팅
        for (int i = 0; i < sizes.length; i++) {
            // 명함의 가로, 세로 사이즈를 할당
            int w = sizes[i][0];
            int h = sizes[i][1];
            // 세로가 가로보다 길다면 가로로 눕히기(swap)
            if (h > w) {
                sizes[i][0] = h;
                sizes[i][1] = w;
            }

            // 각 가로, 세로에 더 큰 값이 나타난다면 max값 갱신
            if (sizes[i][0] > wMax) {
                wMax = sizes[i][0];
            }
            if (sizes[i][1] > hMax) {
                hMax = sizes[i][1];
            }
        }

        return wMax * hMax;
    }
}

MinimumRectangleTest.java

package com.example.Programmers.Lv1;

import static org.junit.Assert.assertEquals;

import org.junit.Test;

public class MinimumRectangleTest {
    @Test
    public void testMinimumRectangle() {
        MinimumRectangle m = new MinimumRectangle();

        int result1 = m.solution(new int[][] { { 60, 50 }, { 30, 70 }, { 60, 30 }, { 80, 40 } });
        int result2 = m.solution(new int[][] { { 10, 7 }, { 12, 3 }, { 8, 15 }, { 14, 7 }, { 5, 15 } });
        int result3 = m.solution(new int[][] { { 14, 4 }, { 19, 6 }, { 6, 16 }, { 18, 7 }, { 7, 11 } });

        assertEquals(4000, result1);
        assertEquals(120, result2);
        assertEquals(133, result3);
    }
}
profile
나의 개발로그

0개의 댓글