프로그래머스 | 최대한 정사각형 구하기

chaen·2024년 2월 16일
post-thumbnail

📌 문제

가로가 w 세로가 h인 직사각형 area가 있습니다. wh보다 길 수 없으며, 여러 가로, 세로 조합 중 두 값의 차이가 가장 적은 값을 찾아 반환하세요.

✨ 해결 방법

제곱근을 활용하면 됩니다. 링크에 작성되어 있듯 제곱근을 구하려면 Math.sqrt()을 활용해야 합니다. area 의 약수 조합인 w,h가 둘 다 제곱근이거나, 더 작은 수인 w가 제곱근보다 작으면서 가장 큰 값일 때 조합을 구해야 합니다.

💻 solution 1

function solution(area) {
    let answer = [];
    let divisor = 1;
    for (let i = 1; i<=Math.sqrt(area); i++){
        if (area % i === 0){
            divisor = Math.max(divisor, i);
        }
    }
    answer.push(divisor, area / divisor);
    return answer;
}

말 그대로 약수를 구하는 방법입니다. 제곱근에 도달하기 전까지 1부터 하나씩 검사하며 약수를 구하고, 그중 가장 큰 값을 구합니다. divisor, 즉 가로를 구했다면 전체 area에서 나눈 값이 h이므로 두 조합을 구하여 배열로 반환합니다.

💻 solution 2

function solution(area) {
    let width = Math.ceil(Math.sqrt(area));
    let height = Math.ceil(area / width);
    return [width, height];
};

같은 방식이지만 직접 약수를 구하지 않고 간단하게 구할 수도 있습니다. 제곱근보다 작거나 같아야 하므로, 제곱근을 구한 후 ceil을 통해 내림하면 width가 구해집니다. 따라서 두 조합을 간단히 구할 수 있습니다.

0개의 댓글