반응형
문제
풀이
첫 풀이
function solution(brown, yellow) {
const sum = brown + yellow;
const sqrt = Math.sqrt(sum);
if(sum % 2 === 1 && sqrt === sum / sqrt) return [sqrt, sqrt];
let min = 1 + sum;
const answer = [];
for(let i = 2; i <= yellow + 2; i++) {
const pairSum = sum / i + i;
if(sum % i === 0 && min > pairSum) {
min = pairSum
answer[0] = Math.max(sum/i, i);
answer[1] = Math.min(sum/i, i);
};
}
return answer;
}
테스트 4, 6, 7, 8 불통
질문하기에서 불통인 이유를 살펴보니 다음과 같은 이유였다.
(18, 6) 이 주어졌을 때 solution = [8, 3]이 나와야만 하는데,
코드에 의하면 [6, 4]가 나오게 된다.
하지만 [6, 4]는 (16, 8)의 답이다.
즉, 주어진 파라미터와 맞지 않는 문제가 발생한다.
이러한 같은 경우도 고려해야만 한다.
두 번째 풀이
총 면적은 다음 수식을 만족한다.
area = yellow + brown = height * width
그리고 brown, yellow는 각 수식을 만족한다.
yellow = (height - 2) * (width - 2)
그러면 brown은 다음 공식을 만족한다.
brown = area - yellow = area - (height - 2) * (width - 2)
따라서 width, height가 될 수 있는 조건들 중에서 해당 조건을 만족하는 width, height가 해답이 된다.
카펫의 가로 길이는 세로의 길이와 같거나, 세로 길이보다 길다고 했다.
따라서 세로의 길이는 최소 3, 최대 (yellow + 2)가 될 수 있다.
그러므로 for문은 이렇게 된다.
for (let height = 3; height <= yellow +2; height++)
for문 안에 들어갈 코드는 앞에서 이야기한 바와 같이, 조건이 만족하는지 보면 된다.
const width = area / height;
const yellowArea = (width - 2) * (height - 2);
const brownArea = area - yellowArea;
// 조건을 만족하는 brownArea, yellowArea가 각각 brown, yellow와 동일하면 해답이므로 답을 반환함
if(brown === brownArea && yellow === yellowArea) return [width, height];
전체 코드
function solution(brown, yellow) {
const area = brown + yellow;
for (let height = 3; height <= yellow + 2; height++) {
const width = area / height;
const yellowArea = (width - 2) * (height - 2);
const brownArea = area - yellowArea;
if(brown === brownArea && yellow === yellowArea) return [width, height];
}
}
통과!
반응형
'CS > 알고리즘' 카테고리의 다른 글
[230414] 예상 대진표 (0) | 2023.04.14 |
---|---|
[230413] 크기가 작은 부분문자열 (0) | 2023.04.13 |
[230411] 피보나치 수 (0) | 2023.04.11 |
[230327] 구명보트: Greedy 알고리즘 (0) | 2023.03.27 |
[230326] 짝지어 제거하기: stack (0) | 2023.03.26 |