코테를 처음 풀어봤다..
생각보다 어려웠다 ㅜ,ㅜ
문제
명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.
아래 표는 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 |