https://school.programmers.co.kr/learn/courses/30/lessons/86491?language=javascript
기존에 풀다가 만 풀이가 있어서 완성 시킨 다음에 새로 풀어봤어요. 아마 시기적으로 6개월 차이가 나는데,,,, 그 때랑 지금이랑 조금 달라졌네요.
6개월 전 : forEach 마니아,,, 지금 : 되도록 일반 반복문 사용,,,
forEach가 반복문 중단(break, continue)이 불가능한게 성능상 단점으로 작용하는 경우가 많아서 안쓰고 있습니다.
명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.
아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.
| 명함 | 번호 | 가로 길이 | 세로 길이 | | 1 | 60 | 50 | | 2 | 30 | 70 | | 3 | 60 | 30 | | 4 | 80 | 40 |
가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다.
모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.
O(n)이기는 한데, 반복문이 세번 돌았습니다.
function solution(sizes) {
return sizes
.map(v => v.sort((a, b) => b - a))
.reduce(
([bef_l, bef_r], [curr_l, curr_r], ..._) =>
[Math.max(bef_l, curr_l), Math.max(bef_r, curr_r)],
[0, 0]
).reduce(
(left, right) => left * right
);
}
동일한 O(n)이면서 반복문은 1번만 돌았습니다.
function solution(sizes) {
let top_width = 0;
let top_height = 0;
for (const [left, right] of sizes) {
const now_width = Math.max(left, right);
const now_height = Math.min(left, right);
top_width = Math.max(top_width, now_width);
top_height = Math.max(top_height, now_height);
}
return top.width * top.height;
}
동일한 O(n)에 반복문 한 개만 돌렸습니다. 기존에는 그냥 원시값(Primitive Type)을 사용했는데, 여기서는 객체 사용했습니다.
최대 카드와 현재 카드는 모두 같은 속성(widht, height)을 가지고 있어서 조금 더 읽기 쉬워지는 것 같습니다. 객체 생성 비용이 발생하기는 하지만, 크게 성능에 영향을 주지는 않을 것 같습니다.
실제로 대다수는 반복문이 얼마나 돌았는가 (이상적인 상황 및 최악의 상황)이 주요 관건입니다.
function solution(sizes) {
const top = { width: 0, height: 0 };
for (const [left, right] of sizes) {
const now = {
width: Math.max(left, right),
height: Math.min(left, right)
}
top.width = Math.max(top.width, now.width);
top.height = Math.max(top.height, now.height);
}
return top.width * top.height;
}