[풀이]
function solution1(sizes) {
const newArr = sizes.map(([w, h]) => (w > h ? [w, h] : [h, w]));
const w = [];
const h = [];
for (let i = 0; i < sizes.length; i++) {
w.push(newArr[i][0]);
h.push(newArr[i][1]);
}
return Math.max(...w) * Math.max(...h);
}
문제를 이해하고 더 큰 숫자를 배열에서 가장 앞쪽에 위치하게 하려고 했다.
처음엔 이중 for문을 통해서 풀어주려고 했는데 굳이 그러지 않아도 됐다.
가로 * 세로 이기 때문에 어처피 인덱스값은 2개만 있을 것이고 0,1 만 쓰므로 굳이 반복을 하지 않아도 된다.
solution1 에서는 newArr 를 만들어 가로값이 더 크면 앞으로 옮기게 해줬다.
그리고 width와 height를 담을 변수를 만들었다.
for문을 통해 width에 새배열의 인덱스값에 따라 가장 앞에 위치하는 값을 넣고
height에 뒤에 있는 값을 넣어줬다. 그러면 가로의 값만 들어간 배열과 세로 값만 들어간 배열이 완성된다.
마지막으로 width와 height에 각각 최대값을 곱해 리턴해주면 된다.
[솔루션2]
function solution2(sizes) {
const w = [];
const h = [];
for (let i = 0; i < sizes.length; i++) {
const max = Math.max(sizes[i][0], sizes[i][1]);
const min = Math.min(sizes[i][0], sizes[i][1]);
w.push(max);
h.push(min);
}
return Math.max(...w) * Math.max(...h);
}
따로 새 배열을 만들지 않고 width와 height를 담을 변수만 만든다.
for문을 통해 최대값을 받을 변수에 sizes[0][0], sizes[0][1] 를 시작으로 변수를 담아주면 된다.
max에는 가로 세로 값 중 큰것이 들어갈 것이고, min에는 작은 값이 들어갈 것이다.
결국 max에는 앞쪽에 오게 하려했던 큰 값들만 위치 (즉, 가로의 값들만 모아줌)하게 된다.
변수들을 각각 width와 height에 넣고 솔루션1처럼 리턴해주면 된다.
[코드리뷰]
function solution(sizes) {
const sortedSizes = sizes.map(([width, height]) =>
width < height ? [height, width] : [width, height]
);
let [maxWidth, maxHeight] = [0, 0];
return sortedSizes.reduce((_, cur) => {
const [width, height] = cur;
maxWidth = Math.max(width, maxWidth);
maxHeight = Math.max(height, maxHeight);
return maxWidth * maxHeight;
}, 0);
}
1. 솔루션 1번처럼 sizes의 요소들을 정렬하고 시작하는 방법이 for문 내 코드 복잡도를 줄여 가독성에 좋다.
2. 배열에 담아 배열의 최댓값을 구해 결과를 내고 잇는데, 숫자를 담는 변수를 만들어 해당 변수에 재할당해 결과를 도출할 수 있다.
그렇게되면 push와 마지막 리턴할때 Math.max(...arr) * Math.max(...arr) 로직 개선이 가능하다.
3. 변수명 w, h 보다 width, height 등 변수를 명확히 해주자.
+) reduce 풀이법은 어려워서 다시 한 번 생각해봐야 할 듯.
'코딩 테스트 > Programmers - 1' 카테고리의 다른 글
[JS] 자연수 뒤집어 배열로 만들기 (0) | 2022.10.04 |
---|---|
[JS] 정수 제곱근 판별 (0) | 2022.10.04 |
[JS] 이상한 문자 만들기 (0) | 2022.10.02 |
[JS] 같은 숫자는 싫어 (0) | 2022.10.01 |
[JS] 최대공약수와 최소공배수 (0) | 2022.09.30 |