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

김도현·2023년 9월 4일
0

TIL

목록 보기
32/76

최소직사각형
이 문제는 가로 세로의 최소 크기의 직사각형을 만드는 것이다.

첫번째 풀이

 int[,] sizes = new int[,] { { 60,50 }, { 30,70 }, { 60,30 }, { 80,40 } };
 int[,] width = new int[2, 2];
 int[,] height = new int[2, 2];
 int answer = 0;
 for (int i = 0; i < sizes.Length / 2; i++)
 {

     if (sizes[i, 0] > width[0, 0])
     {
         width[1, 0] = width[0, 0];
         width[1, 1] = width[0, 1];
         width[0, 0] = sizes[i, 0];
         width[0, 1] = i;
     }
     else if (sizes[i, 0] > width[1, 0])
     {
         width[1, 0] = sizes[i, 0];
         width[1, 1] = i;
     }

     if (sizes[i, 1] > height[0, 0])
     {
         height[1, 0] = height[0, 0];
         height[1, 1] = height[0, 1];
         height[0, 0] = sizes[i, 1];
         height[0, 1] = i;
     }
     else if (sizes[i, 1] > height[1, 0])
     {
         height[1, 0] = sizes[i, 1];
         height[1, 1] = i;
     }
     Console.WriteLine("가로 : {0} , 세로 : {1}", width[0, 0], height[0, 0]);
 }
 answer = width[0, 0] * height[0, 0];
 if (width[0, 1] != height[0, 1])
 {
     if (answer > width[1, 0] * (sizes[width[0, 1], 1] > height[0, 0] ? sizes[width[0, 1], 1] : height[0, 0])) //이부분의 값은 else 설정
     {
         if (width[1, 0] * (sizes[width[0, 1], 1] > height[0, 0] ? sizes[width[0, 1], 1] : height[0, 0]) > (sizes[height[0, 1], 0] > width[0, 0] ? sizes[height[0, 1], 0] : width[0, 0]) * height[1, 0])
         {
             answer = (sizes[height[0, 1], 0] > width[0, 0] ? sizes[height[0, 1], 0] : width[0, 0]) * height[1, 0];
         }
         else
         {
             answer = width[1, 0] * (sizes[width[0, 1], 1] > height[0, 0] ? sizes[width[0, 1], 1] : height[0, 0]);
         }
     }
 }

 Console.WriteLine(answer);

이렇게 만들면 첫번 째 문제는 풀 수 있지만 두번 째 케이스에서 통과를 못한다....
두번 째 케이스 { { 10, 7 }, { 12, 3 }, { 8, 15 }, { 14, 7 }, { 5, 15 } }
이러면 세로의 최대크기가 동일한게 있어서 바꾸면 안되는데 윗코드에서는 그사항을 거르지 못하기 때문이다.

이를 해결하기 위해서 생각을 해보있다.
그냥 단순하게 들어오는 값을 비교 후 크기가 큰 값에는 가로에 넣고 작은 값에는 세로에 넣으면 최적화 된 크기가 안되는가? 라는 생각이 들었다. 한번 시도해 보자

int[,] sizes = new int[,] { { 10, 7 }, { 12, 3 }, { 8, 15 }, { 14, 7 }, { 5, 15 } };
int width = 0;
int height = 0;
for (int i  = 0; i < sizes.GetLength(0);  i++)
{
    int max = 0;
    int min = 0;
    if(sizes[i, 0] >= sizes[i, 1])
    {
        max = sizes[i, 0];
        min = sizes[i, 1];
    }
    else
    {
        max = sizes[i, 1];
        min = sizes[i, 0];
    }
    width = Math.Max(width, max);
    height = Math.Max(height, min);
}
Console.WriteLine(width * height);

작성했더니 된다... 아주 쉬운 문제인데 어렵게 생각했다... 그리고 코드도 깔끔하고 최적화도 잘되어 있다...

0개의 댓글