알림
본 포스팅은 공부 목적으로 작성된 글이며 상업적 목적으로 절대 사용되지 않았음을 밝힙니다.
문제
https://school.programmers.co.kr/learn/courses/30/lessons/86491
가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다.
이때의 지갑 크기는 4000(=80 x 50)입니다.
모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다.
모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.
코드
function solution(sizes) {
let answer = 0;
for(let card of sizes){
if(card[0] < card[1]) [card[0], card[1]] = [card[1], card[0]]
}
let w = Math.max(...sizes.map((card) => card[0]));
let h = Math.max(...sizes.map((card) => card[1]));
return answer = w * h;
}
풀이
문제는 명함의 가장 길이가 긴 가로와 세로의 길이를 측정하여 카드 지갑을 만들고자 합니다.
왜냐하면 어떤 명함이 제작되어도 수납이 가능하기 위해서입니다.
그리고 그 중에서 세로가 긴 명함은 가로로 눕힌다면,
문제에서 말하는 모든 명함을 수납이 가능한 카드 지갑 중 가장 작은 지갑을 만들 수 있을 겁니다.
따라서 2차원 배열의 요소 중, 가로로 눕혔을 때 지갑의 크기에 영향을 줄 수 있는 요소를 구해야 합니다.
우선 그 요소는 쉽게 찾을 수 있었는데요.
바로 가로의 길이보다 세로의 길이가 긴 요소를 찾으면 됩니다.
왜냐하면 명함을 눕힌다는 것은 가로와 세로의 길이를 바꾼다는 것이기 때문에,
가로보다 세로가 긴 명함을 찾아 이 둘을 바꿔주면 문제에서 요구하는 효율적인 지갑을 만들 수 있게 됩니다.
두 번째로 최대값을 구해주는 Math.max() 함수를 통해 가장 긴 가로와 가장 긴 세로를 변수에 담아 곱하여 리턴해주면 됩니다.
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] 소수 만들기(JavaScript) (0) | 2022.07.29 |
---|---|
[Programmers] K번째수(JavaScript) (0) | 2022.07.29 |
[Programmers] 문자열 내림차순으로 배치하기(JavaScript) (0) | 2022.07.27 |
[Programmers] 약수의 개수와 덧셈(JavaScript) (0) | 2022.07.27 |
[Programmers] 가운데 글자 가져오기(JavaScript) (0) | 2022.07.26 |
댓글