function solution(brown, yellow) {
var answer = [];
for (var a = 1; a <= yellow; a++) {
if (yellow % a === 0) {
if ((yellow / a + 2) * 2 + a * 2 === brown) {
if (a + 2 <= yellow / a + 2) {
answer.push(yellow / a + 2);
answer.push(a + 2);
} else {
answer.push(a + 2);
answer.push(yellow / a + 2);
}
break;
}
}
}
return answer;
}
solution(10, 2);
좀 급하게 푸느라 정리가 안된 모습이다....
내가 생각한 로직은 다음과 같다.
모든 탐색을 노란색의 갯수를 기준으로 수행한다.
노란색을 한 줄로 만들때
노란색을 두 줄로 만들때
노란색을 세 줄로 만들때 ....
모든 가능한 수를 전부 탐색한다. 이 때 노란색은 완전한 사각형의 형태를 가져야하므로 나누어 떨어지는 경우에만 처음 들어온 갈색 갯수
와 가질 수 있는 갈색 갯수
가 같은지 비교한다.
같으면 정답 이므로 answer
에 큰 순서대로 넣는다.
// 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
// 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
function solution(brown, red) {
var answer = [];
for (var i = 3; i <= (brown+red)/i; i++) {
var x = Math.floor((brown+red)/i);
if( (x-2)*(i-2)=== red) {
break;
}
}
return [x,i];
}
i
는 전체 세로 줄을 의미한다. 전체 세로줄을 정해놓으면 문제의 카펫은 사각형을 유지해야하므로 전체 가로줄을 정할 수 있다. brown+red / 세로줄 은 가로줄임.
가로줄에서 두개 빼면 노란색의 가로줄임
세로줄에서 두개 빼면 노란색의 세로줄임
이 둘을 곱하면 노란색의 갯수가 나와야 정답. ( 아마 나누어 떨어지는 경우에만 답이 나올 것임. )