Coding Test/Programmers

[Programmers] level 2. 카펫(완전 탐색) js

개발자 나르 2022. 10. 5. 17:35
반응형

문제 설명

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

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

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

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

출처

※ 공지 - 2020년 2월 3일 테스트케이스가 추가되었습니다.
※ 공지 - 2020년 5월 11일 웹접근성을 고려하여 빨간색을 노란색으로 수정하였습니다.

풀이

function solution(brown, yellow) {
    let answer = [];
    let total = brown + yellow;
    let arr = [];    
    for(let i = 2; i < total/2 ;i++) {
        if(total % i === 0) {
            arr.push([total/i ,i]);
        }
    }
    answer = arr.filter( value => (value[0] + value[1]) * 2 - 4 === brown)[0];
    
    return answer;
}

 

풀이 설명

먼저 타일의 총 개수인 변수 total을 선언해줍니다.

총 개수로 나올 수 있는 합성수의 조합들을 arr 배열에 집어넣어 주고 식을 통해서 정답을 구하는 풀이입니다.

 

총 개수의 합성수 구하는 법

for(let i = 2; i < total/2 ;i++) {
        if(total % i === 0) {
            arr.push([total/i ,i]);
        }
    }

합성수(合成數, composite number)는 1보다 큰 자연수 중에서 소수가 아닌 수로, 약수의 개수가 3개 이상이고 둘 이상의 소수를 곱한 자연수이다.

예시 3번을 예시로 total이 48이므로 arr 배열에는 [[24, 2], [16, 3], [12, 4], [8, 6], [6, 8], [4, 12], [2, 24]] 의 값으로 할당되게 됩니다.

이 조합으로 brown을 통해서 계산하거나 yellow를 통해서 계산하면 됩니다.

 

brown 계산식

(value[0] + value[1]) * 2 - 4 === brown

yellow 계산식

(value[0]-2) * (value[1]-2) === yellow

이 식들을 통해서 나온 값들은 answer = [[8,6], [6,8]];이 되고 가로의 길이가 더 길기 때문에 [8,6]만 해당되어서 answer[0]을 return값으로 반환해줍니다. 합성수를 뽑을 때에 [total/i, i] 이렇게 뽑아줬기 때문에 answer[0]이 되는 것이고 [i, total/i] 로 합성수를 뽑게 되면 answer[1]로 반환값을 적어주면 됩니다.

 

 

filter()함수에 대한 자세한 내용

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

 

Array.prototype.filter() - JavaScript | MDN

filter() 메서드는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환합니다.

developer.mozilla.org

 

반응형