최소직사각형
이 문제는 가로 세로의 최소 크기의 직사각형을 만드는 것이다.
첫번째 풀이
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);
작성했더니 된다... 아주 쉬운 문제인데 어렵게 생각했다... 그리고 코드도 깔끔하고 최적화도 잘되어 있다...