Leo는 카펫을 사러 갔다가
중앙에는노란색으로 칠해져 있고 테두리 1줄은갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo가 본 카펫에서 갈색 격자의 수brown, 노란색 격자의 수yellow가 매개변수로 주어질 때
카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
(카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.)
1번 힌트 : 가로와 세로 길이의 합과
brown의 관계가로 세로 크기의 합 * 2 - 4 = brown
brown은 카펫의 테두리를 1줄 감싸고 있으므로 가로와 세로의 길이의 합에서 겹치는 부분 4군데를 빼면brown에 해당하는 면적을 구할 수 있다.
□□□□ □ : 갈색
□■■□ ■ : 노란색
□□□□- 이러한 구조의 카펫이라고 할 때 가로와 세로는 각각 4와 3이다.
- (4 + 3) * 2 - 4 = 10 =
brown2번 힌트 : 전체 면적과 가로 세로의 관계
가로 * 세로 = sumOfArea
- 이는 당연한 힌트이다. 가로 길이와 세로 길이의 곱이 넓이로 정의되어 있기 때문이다.
따라서brown+yellow는 가로와 세로의 곱이 된다.
width= 'sumOfArea' /height이므로
(width+height) * 2 - 4 =brown식을height에 대해 정리할 수 있다.
2 *height+ 2 * (sumOfArea/height) - 4 =brown
height는 양수 이므로 양 변에 곱해준다.
→ 2 *height^ 2 + 2 *sumOfArea- 4 *height=brown*height
→ 2 *height^ 2 - (brown+ 4) *height+ 2 *sumOfArea= 0최종적으로 산출된 식은 다음과 같다.
f(height) = A *height^ 2 + B *height+ C
A = 2
B = - (brown+ 4)
C = 2 *sumOfArea
height 구하기private int CalculateHeight(int sumOfArea, int brown)
{
// f(height) = A * height ^ 2 + B * height + C
// A = 2
// B = - (brwon + 4)
// C = 2 * sumOfArea
double discriminant = Math.Pow(4 + brown, 2) - (16 * sumOfArea);
// 판별식이 음수이면 실근이 없으므로 유효한 해가 없습니다.
if (discriminant < 0)
return -1; // 또는 예외 처리
double sqrtDiscriminant = Math.Sqrt(discriminant);
double height1 = ((4 + brown) + sqrtDiscriminant) / 4.0;
double height2 = ((4 + brown) - sqrtDiscriminant) / 4.0;
if(height1 > height2)
return (int)height2;
else
return (int)height1;
}
height에 대해 정리한 2차식을 먼저 판별식을 사용해 해가 있는지 여부를 판단한다.height로 반환한다.width 구하기private int CalculateWidth(int sumOfArea, int height)
{
return sumOfArea / height;
}
width를 구해준다.public int[] Solution(int brown, int yellow) {
//가로 크기, 세로 크기 순서
int[] answer = new int[2];
int width = 0;
int height = 0;
int sumOfArea = brown + yellow;
height = CalculateHeight(sumOfArea, brown);
if(height == -1)
throw new Exception("Can not find correct height");
width = CalculateWidth(sumOfArea, height);
answer = [width, height];
return answer;
}