본문 바로가기
내일배움 과제/코딩테스트

알고리즘 79번 - 카펫

by GREEN나무 2025. 2. 17.
728x90

URL : https://school.programmers.co.kr/learn/courses/30/lessons/42842

JS

문제

더보기

문제 설명

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

갈색 격자의 수 brown8 이상 5,000 이하인 자연수입니다.

노란색 격자의 수 yellow1 이상 2,000,000 이하인 자연수입니다.

카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

입출력 예

brown yellow return
10 2 [4, 3]
8 1 [3, 3]
24 24 [8, 6]

 

 


계획

노란색 타일의 개수 = (가로-2) * (세로-2)

갈색 타일 개수 = (가로+세로)*2-4

 

노란색 뭉쳤을 때 가로세로의 합이 (갈색/2)-3일 때가 맞는 크기임.

위의 경우를 찾고   if((yX+(yAll/yX)=== (bAll/2)-3) 

총 가로세로 값 구해서 반환.

bX = yX+2

bY = (yAll/yX)+2

return [bX,bY]

 


참고, 풀이

function solution(brown, yellow) {
    let [yX, yAll, bAll] = [1, yellow, brown];

    for (yX = 1; yX < yellow; yX++) {
        if (yX + yAll / yX === bAll / 2 - 3) {
            return;
        }
    }

    let bX = yX + 2;
    let bY = yAll / yX + 2;
    return [bX, bY];
}
테스트 3
입력값 24, 24
기댓값 [8, 6]
실행 결과 실행한 결괏값 [26,3]이 기댓값 [8,6]과 다릅니다.

yX는 노란색타일 총 합의 약수여야 한다.

 yellow % yX ===0 


function solution(brown, yellow) {
    for (let yX = 1; yX <= Math.sqrt(yellow); yX++) {
        if (yellow % yX === 0) {
            let yY = yellow / yX;
            let bX = yY + 2;
            let bY = yX + 2;
            if (brown === 2 * (bX + bY - 2)) {
                return [bX, bY];
            }
        }
    }
}

코드 간략화하기

function solution(brown, yellow) {
    for (let yX = 1; yX * yX <= yellow; yX++) {
        if (yellow % yX === 0) {
            let bX = yellow / yX + 2, bY = yX + 2;
            if (brown === 2 * (bX + bY - 2)) return [bX, bY];
        }
    }
}
function solution(b, y) {
    for (let x = 1; x * x <= y; x++) 
        if (y % x === 0 && b === 2 * (x + y / x + 2)) 
            return [y / x + 2, x + 2];
}

다른사람 답

function solution(brown, yellow) {
    var xpy=brown/2+2;
    for(var a=1;a<xpy;a++) if(a*(xpy-a)==brown+yellow)  return [Math.max(a,xpy-a),Math.min(a,xpy-a)];
}
function solution(brown, yellow) {
    const x = (brown - 12) * 0.5;
    const y = yellow - brown + 8;
    const i = ( 8 + x + Math.sqrt( Math.pow(x, 2) - (4 * y) ) ) * 0.5;
    const j = ( 8 + x - Math.sqrt( Math.pow(x, 2) - (4 * y) ) ) * 0.5;
    console.log(i)


    var answer = [i, j];
    return answer;
}