100/100
테두리색은 갈색, 그 안의 색은 노란색으로 채울때 가로세로의 길이를 리턴
그냥 코드식을 세우면
a x b = brown + yellow
(a-2) * (b-2) = yellow
이 두식을 이용해서
a + b = (brown + 4)/2 를 알 수 있다.
function solution(brown, yellow) {
const ab = brown+yellow;
const a_Plus_b = (brown+4)/2;
const valI = Math.ceil(ab**0.5);
const valJ = a_Plus_b - valI;
for(let i=valI,j=valJ;;i++,j--)
if(i*j === ab && i+j === a_Plus_b)
return [i,j]
}
위에서 말했듯이
ab
와a_Plus_b
를 찾아내고
해당 값의valI
를a*b
의 값이 최대일때를 기준으로 조금씩a*b
가 작아지면서 찾아냈다.
ex)valI
가 ab가 25라면valI
가 5이므로 5부터 차근차근 찾아본다.
valI
가 증가할수록valJ
는 감소시켜서 if문을 만족하는 것을 찾는 순간 리턴한다.
function solution(brown, yellow) {
const ab = brown+yellow;
const a_Plus_b = (brown+4)/2;
for(let i=a_Plus_b,j=0;;i--,j++)
if(i*j === ab && i+j === a_Plus_b)
return [i,j]
}
이렇게 i를 a+b, j를 0부터 시작해서 해도 문제는없더라
만약 효율성 문제도 고려했으면 위의코드가 좀더 빠르지않을까 그냥 생각해본다.