코테를 처음 풀어봤다..
생각보다 어려웠다 ㅜ,ㅜ
문제
명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.
아래 표는 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 함수를 완성해주세요.
제한사항
sizes의 길이는 1 이상 10,000 이하입니다.
sizes의 원소는 [w, h] 형식입니다.
w는 명함의 가로 길이를 나타냅니다.
h는 명함의 세로 길이를 나타냅니다.
w와 h는 1 이상 1,000 이하인 자연수입니다.
입출력 예
sizes | result |
---|---|
[[60, 50], [30, 70], [60, 30], [80, 40]] | 4000 |
[[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]] | 120 |
[[14, 4], [19, 6], [6, 16], [18, 7], [7, 11]] | 133 |
for 만 사용해서 어찌저찌 풀긴 했다 ㅠㅠ
단순해 보이는데 생각이 잘 안난다
function solution(sizes) {
var answer = 0;
var bigMax = 0;
var smallMax = 0;
for(let i = 0; i < sizes.length; i++){
// 0 큰변일때
if(sizes[i][0] > sizes[i][1]){
if(bigMax < sizes[i][0]){
bigMax = sizes[i][0];
}
if(smallMax < sizes[i][1]){
smallMax = sizes[i][1];
}
// 0이 작은변 일때
}else{
if(bigMax < sizes[i][1]){
bigMax = sizes[i][1];
}
if(smallMax < sizes[i][0]){
smallMax = sizes[i][0];
}
}
};
answer = smallMax * bigMax;
return answer;
}
풀면서 map 과 forEach 같은거 쓰면 코드를 줄일 수 있겠다고 생각했다.
다른 분들의 풀이를 보니 역시 그렇게 한 코드가 가장 괜찮아 보였다.
function solution(sizes) {
const rotated = sizes.map(([w, h]) => w < h ? [h, w] : [w, h]);
let maxSize = [0, 0];
rotated.forEach(([w, h]) => {
if (w > maxSize[0]) maxSize[0] = w;
if (h > maxSize[1]) maxSize[1] = h;
})
return maxSize[0]*maxSize[1];
}
근데 여기서 [w, h] 구조분해할당 부분이 한눈에 들어오지 않았다.
[w, h] 가 그냥 element, index, array 중 element 인데 뭔가 한참 보다가 알았다.
수련이 필요해...
다음은 이 코드에 대한 선생님의 해설이다.
안녕하세요! 질문하신 JavaScript 코드에서 사용된 구조 분해 할당(destructuring assignment)에 대해 설명드리겠습니다.
구조 분해 할당은 배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있게 하는 JavaScript 표현식입니다.
위 코드에서는 sizes.map(([w, h]) => ...)
부분에서 배열의 각 요소를 구조 분해 할당을 통해 w
와 h
라는 변수로 각각 할당하고 있습니다. 이는 각 배열 요소가 [width, height]
형태의 배열로 구성되어 있음을 가정하고 있는데, 구조 분해를 사용함으로써 각각의 너비와 높이를 더 쉽게 접근할 수 있습니다.
예를 들어, sizes
가 [[14, 7], [5, 8]]
와 같은 배열이라고 할 때, sizes.map()
함수는 각 하위 배열에 대해 실행되며, [w, h]
를 통해 각각의 첫 번째 요소를 w
, 두 번째 요소를 h
에 할당합니다. 그리고 화살표 함수 내에서는 w
와 h
를 사용하여 조건에 따라 값을 변경하거나 비교할 수 있습니다.
코드에서 w < h ? [h, w] : [w, h]
부분은 w
와 h
의 크기를 비교하여 w
가 h
보다 작으면 두 값을 바꿔서 배열로 다시 반환합니다. 이는 최종적으로 각각의 너비와 높이를 비교하여 더 큰 값이 항상 첫 번째 위치에 오도록 보장하기 위함입니다.
forEach
루프에서는 rotated
배열의 각 요소를 순회하면서, 현재 요소의 너비(w
)가 현재까지 발견된 최대 너비(maxSize[0]
)보다 크면 업데이트하고, 높이(h
)가 최대 높이(maxSize[1]
)보다 크면 그것도 업데이트합니다. 최종적으로 maxSize[0]
와 maxSize[1]
을 곱하여 최대 사각형의 면적을 계산합니다.
'algorithm' 카테고리의 다른 글
코테6 - 배열의 유사도 (0) | 2024.03.04 |
---|---|
코테5 - 다음에 올 숫자 (0) | 2024.03.04 |
코테4 - 붕대감기 (0) | 2024.03.02 |
코테3 - 옹알이 (0) | 2024.03.01 |
코테2 - 문자열 내 마음대로 정렬하기 (2) | 2024.02.29 |