프로그래머스
처음에는 복잡하게 생각해서 다음과 같이 코드를 작성했고, 테스트케이스를 거의 통과하지 못했다.
swap을 통해서 결국, 큰 값을 하나의 배열(widths 또는 heights)에 몰아서, widths 배열의 최댓값과 heights 배열의 최댓값의 곱을 리턴시키려고 했던 것이다.
function solution(sizes){
let widths = [];
let heights = [];
let maxWidth = 0;
let maxHeight = 0;
for(let i=0;i<sizes.length;i++){
widths.push(sizes[i][0]);
heights.push(sizes[i][1]);
}
maxWidth = Math.max(...widths);
maxHeight = Math.max(...heights);
const swap = (arr1, arr2, maxVal) => {
const idx = arr1.indexOf(maxVal);
const temp = arr2[idx];
arr2[idx] = maxVal;
arr1[idx] = temp;
maxWidth = Math.max(...widths);
maxHeight = Math.max(...heights);
}
if(maxWidth>=maxHeight){
swap(widths,heights,maxWidth);
for(let i=0;i<widths.length;i++){
if(widths[i]<maxHeight && widths[i]!==maxWidth){
swap(widths,heights,widths[i])
}
}
}else{
swap(heights,widths,maxHeight);
for(let i=0;i<heights.length;i++){
if(heights[i]<maxWidth && heights[i]!==maxHeight){
swap(heights,widths,heights[i]);
}
}
}
return maxWidth * maxHeight;
}
이 풀이는 큰값을 max 배열에 몰고, 작은 값을 min 배열에 몰아서 각각의 최댓값의 곱을 리턴한다.
나와 같은 의도였지만, 훨씬 간결하고 직관적인 코드로 문제를 해결했다. 가로와 세로 길이에 자꾸 연연했는데, 이 풀이를 보니, 가로, 세로는 중요하지 않고 두 개의 길이 중에서 큰것과 작은 것을 구분하는 것에 초점을 두고 문제를 해결하면 된다는 것을 깨달았다.
function solution(sizes){
let max = [];
let min = [];
for(const el of sizes){
if(el[0]<el[1]){
max.push(el[1]);
min.push(el[0]);
}else{
max.push(el[0]);
min.push(el[1]);
}
}
return Math.max(...long)*Math.max(...short);
}
이 풀이도 의도는 같은데, 배열을 쓰지 않고, 변수에 최솟값 0을 할당해놓고, sizes의 요소인 s의 최댓값을 longer에, 최솟값을 shorter에 반복해서 저장, 업데이트한다.
function solution(sizes){
let longer = 0;
let shorter = 0;
sizes.forEach((s) => {
if(longer < Math.max(...s)) longer = Math.max(...s);
if(shorter < Math.min(...s)) shorter = Math.min(...s);
});
return longer*shorter;
}