알고리즘 코딩

최소직사각형 알고리즘 feat. apply() 메서드

가문비7 2023. 4. 18. 07:11

코딩테스트다. 자세한 문제는 아래와 같다.

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

 

나의 답안으로 본격 들어가기 전에 문제에 대한 생각을 해보았다. 어떤 논리 과정을 거쳐야 문제의 답안을 도출할 수 있을까? 

아래와 같은 명함 사이즈 배열이 있다고 하자. 이 모든 사이즈의 명함이 들어가는 가장 작은 명함지갑의 크기를 알아내는 것이다.

 

size3  = [[14, 4], [19, 6], [6, 16], [18, 7], [7, 11]]

 

[14,4] 요소에서 14는 가로, 4는 세로길이다. 다른 요소들도 마찬가지다. 물론 명함을 돌리면 가로세로는 서로 바뀐다.

명함들은 길이를 보면 모두 직사각형이기 때문에 긴쪽 길이와 짧은 쪽 길이가 있다. 

긴 길이들 중 가장 큰 숫자와, 짧은 길이들 중 가장 큰 숫자를 곱하면 모든 명함을 넣을 수 있는 최소 사이즈가 나온다.

하여 나의 답안은 아래와 같다.

 

 

function solution(arr) {
    var answer = 0;
    sorted = arr.map((i)=>i.sort((a,b)=>b-a)) // arr 의 모든 요소(배열)들의 내부요소를 내림차순 정렬함.
    // 정렬하면 i[0] 이 긴쪽 길이, i[1]이 짧은 쪽 길이가 됨.
    max1 = Math.max.apply(null, arr.map((i)=>i[0])) 
    // 정렬된 arr을 map 이 돌면서 0번째 요소만 꺼내 새로운 배열을 만들고 -> Math.max 메서드가 그 배열의 가장 큰 숫자를 꺼냄.

    max2 = Math.max.apply(null, arr.map((i)=>i[1]))
    // 정렬된 arr을 map 이 돌면서 1번째 요소만 꺼내 새로운 배열을 만들고 -> Math.max 메서드가 그 배열의 가장 큰 숫자를 꺼냄.
    console.log(max2)

    return answer = max1 * max2
    // 가장 큰 긴쪽 길이 * 가장 큰 짧은 쪽 길이
}

size1 = [[60, 50], [30, 70], [60, 30], [80, 40]]	 //

size2 = [[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]]	

size3 = [[14, 4], [19, 6], [6, 16], [18, 7], [7, 11]]  // 


solution(size1)

 

여기서 특별히 기억할 점은 아래와 같다.

1) apply(null, arr) 메서드는 본 메서드 앞의 함수를 arr 에 적용시켜 준다.