프로그래머스 8주차 문제입니다.
모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.
function solution(sizes) {
var answer = 0;
let arr = [];
let minW = [];
let minH = [];
for(let i = 0; i <sizes.length; i++){
sizes[i][0]>sizes[i][1] ? arr.push(sizes[i]) : arr.push([sizes[i][1],sizes[i][0]]);
minW.push(arr[i][0]);
minW.sort(function(a, b) { return b - a; });
minH.push(arr[i][1]);
minH.sort(function(a, b) { return b - a; });
}
return answer= minW[0]*minH[0];
}
이번에도 직관적으로 풀었다. 아직 뭔가 더 간단한 방법을 찾기보다 이해한 그대로 푸는것부터 시작해야겠다는 생각으로.
명함지갑에 명함의 가로 세로 방향을 바꿔 넣을 수 있다는 조건이 있다. 그래서 각 명함의 가로 세로 중 가장 큰사이즈를 가로로 몰주고, 더 작은 값을 세로로 몰아주었다.
그리고 몰아준 가로 사이즈중 가장 큰값 x 몰아준 세로 사이즈중 가장 큰값을 return 했다.
역시 다른분들의 풀이를 보니 배울게 많았다. 그 중 몇가지를 뽑아왔다.
이 코드로 배운점이 많았다.
arr.sort()는 원배열을 정렬한 후 그 값을 반환한다. MDN참고
for 문 대신 forEach문 사용, MDN참고
if(조건) 실행, 이렇게 사용할 수 있다는 것!
그리고 answer 마저도 삭제하고 return 값만 맞으면 되는구나도 배움!
function solution(sizes) {
let w = 0;
let h = 0;
sizes.forEach(s => {
const [a, b] = s.sort((a,b) => a-b); //오름차순 정리
if (a > h) h = a;
if (b > w) w = b;
});
return w * h;
}
이건 위 forEach를 사용한것 과 map을 사용한 부분까지는 비슷하다. 대신 sort를 내림차순으로 해주었고, Math.max()로 가장 큰 수를 뽑았다.
Math.max()는 입력받은 값에서 가장 큰값을 반환한다. MDN참고
function solution(sizes) {
sizes.map((item) => item.sort((a, b) => b - a)) //내림차순으로 원배열 정렬
let hMax = Math.max(...sizes.map((item)=> item[0])) //Math.max()에 배열을 사용하기 위해서 ...으로 배열을 복사해줌!
let wMax = Math.max(...sizes.map((item) => item[1]));
return hMax * wMax;
}
reduce 다시한번 짚어보기
function solution(sizes) {
const [hor, ver] = sizes.reduce(([h, v], [a, b]) => [Math.max(h, Math.max(a, b)), Math.max(v, Math.min(a, b))], [0, 0])
return hor * ver;
}