https://school.programmers.co.kr/learn/courses/30/lessons/42842
일단,
가로를 x, 세로를 y라고 하면
x * y = brown + yellow
(넓이)
이고,
(x-2) * (y-2) = yellow
(노란색 넓이)
이렇게 된다.
두 개의 미지수 x, y에 대한 식이 2개 있으니까 이차방정식을 만들 수 있겠다.
다음은 위 두 식을 이용해서 x에 대한 이차방정식을 유도하는 과정 ..
(x-2)(y-2) = yellow
xy - 2x - 2y + 4 = yellow
(yellow + brown) - 2x - 2y + 4 = yellow
brown - 2x - 2y + 4 = 0
0.5brown - x - y = 2
y = - x + 0.5brown + 2
x(-x + 0.5brown + 2) = yellow + brown
-x^2 + (0.5brown + 2)x - (yellow+brown) = 0
x^2 - (0.5brown + 2)x + (yellow + brown) = 0
x^2 - (0.5brown + 2)x + (yellow + brown) = 0
이렇게 x에 대한 이차식을 만들었으니
x값은 근의 공식
을 통해 구할 수 있다.
그래서 x값은 항상 양수이고, y보다 크므로 +라고 가정하면 x를 구하는 식은 다음과 같다.
x = 0.5 * ((0.5*brown + 2) + sqrt(pow((0.5*brown + 2), 2) - 4 * (yellow + brown)))
끝~
easy.
오랜만에 중2수학이라 재밌었다
#include <string>
#include <vector>
#include <cmath>
using namespace std;
vector<int> solution(int brown, int yellow) {
vector<int> answer;
int x = 0.5 * ((0.5*brown + 2) + sqrt(pow((0.5*brown + 2), 2) - 4 * (yellow + brown)));
int y = -x + 0.5 * brown + 2;
answer.push_back(x);
answer.push_back(y);
return answer;
}
그래도,,
완전탐색이라 그렇게 풀어보고 싶었고,,
원하는게 위 처럼 푸는게 아닌 것 같아서 좀 풀어서 해봤다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<int> solution(int brown, int yellow) {
vector<int> answer;
int area = brown + yellow;
int width = area - 3;
int height = 3;
while(width >= height) {
if (area % height == 0) {
width = area / height;
if ((width - 2) * (height - 2) == yellow) {
answer.push_back(width);
answer.push_back(height);
break;
}
}
width--;
height++;
}
return answer;
}