Coding test

[프로그래머스] 카펫 (Level 2) - javescript

Jiwoo 2022. 5. 6. 15:29

문제

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

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

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

  • 제한사항
    • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
    • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
    • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
       

나의 풀이

function solution(brown, yellow) {

    let arr = [];

    for (let c = 1; c <= Math.sqrt(brown + yellow); c++) {

        let r = (brown+yellow)/c;

        if ( r % 1 === 0) {
            if((r-2) * (c-2) === yellow) arr = [r,c];
        }
    }
    return arr;
}

 
역으로 값을 구하는 문제는 처음이라 당황했지만, 생각보다 코드를 간결하게 구현해냈다.

 

  • 정확도 테스트 결과


     

모범 답안

for (let c = 3; c <= (brown+yellow)/c; c++) {

        let r = (brown+yellow)/c;

        if((r-2) * (c-2) === yellow) return [r,c];
        }
    }

 
yellow가 1보다 크다는 것은 영역이 무조건 존재한다는 것이고, 가로와 세로 길이 모두 3이상이라는 것이다.
그렇기에 순회를 3부터 도는 것으로 수정했다.
그리고 가로, 세로 길이가 정수라는 조건은 없으니, 정수 검사 부분을 삭제했고
따로 변수를 받지 않고 바로 값을 반환하게 수정했더니 훨씬 깔끔해졌다.
 

  • 정확도 테스트 결과