ABOUT ME

Today
Yesterday
Total
  • [프로그래머스] 카펫
    개발 공부/알고리즘 2023. 3. 23. 00:08

    문제 설명

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

     

     

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

     

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

    제한사항

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

    문제 접근

    입력하는 수가 작은거 같다..? 다 돌려도 시간이 오래 걸리지 않을꺼 같다? => 완전탐색.

    완전 탐색은 별 생각없이 반복문을 돌려주면 된다. 

     

    갈색 격자는 테두리에 위치해 있고 노란색 격자는 그 안에 위치되어 있다.

    나는 입력된 노란색 격자의 수를 가지고 반복문을 돌려주었다.

    만약 노란색 격자의 수가 두 정수의 곱이 된다면
    작은 수는 노란색 격자 세로, 큰 수는 가로에 넣어준다.

    갈색 가로 세로 길이는 노란색 가로 세로보다 2개씩 많다.

    즉 갈색의 개수는  = (노란색 가로 + 2 + 노란색 세로 + 2) * 2 - 4

    정리하면 노랑 가로 + 노랑 세로 = (갈색 + 4) / 2 - 4 이다.

    두개의 식은 똑같으니 아무거나 해도 괜찮다.

     

    checkBrown함수에서 True가 리턴된다면 answer에 답을 푸시하고 리턴해주었다.

    코드

    function checkBrown(y_w, y_h, brown) {
        return y_w + y_h === (brown + 4) / 2 - 4;
    }
    
    function solution(brown, yellow) {
        let y_w;
        let y_h;
        var answer = [];
        
        for (let i = 1; i <= yellow / i; i++) {
            if (yellow % i === 0) {
                y_h = i;
                y_w = yellow / i;
                if(checkBrown(y_w, y_h, brown)){
                    answer.push(y_w + 2);
                    answer.push(y_h + 2);
    				return answer;
                }
            }
        }
        
        return 'error';
    }
    
    console.log(solution(10, 2));
    console.log(solution(8, 1));
    console.log(solution(24, 24));

    '개발 공부 > 알고리즘' 카테고리의 다른 글

    [프로그래머스] 모음사전  (0) 2023.03.30
    [완전탐색] 모의고사  (0) 2023.03.30
Designed by Tistory.