프로그래머스 알고리즘 고득점 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);
}
}