문제 설명
array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
제한사항
arr은 자연수를 담은 배열입니다.
정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
divisor는 자연수입니다.
array는 길이 1 이상인 배열입니다.
입출력 예
arr divisor return
[5, 9, 7, 10] 5 [5, 10][2, 36, 1, 3] 1 [1, 2, 3, 36][3,2,6] 10 [-1]
일단 내 풀이는
function solution(arr, divisor) {
let answer =[];
for(let i = 0; i < arr.length; i++) {
if (arr[i] % divisor === 0) {
answer.push(arr[i]);
}
}
if (answer.length === 0) {
answer.push(-1);
}
answer.sort((a, b) => a - b);
return answer;
}
배열을 나누었을때 나누어지는 숫자가 있으면 반환하고 아니면 -1을 반환해라라는 심플한 문제였다. 사실 문제 자체를 이해하는데에는 생각보다 진짜 1-3분 정도밖에 안걸렸는데, 이걸 풀 때 나는 한글로 적어둔 내 설명을 코드로 바꾸기 힘들었다.
내가 하고싶었던건, arr를 나누고 그게 나머지가 0 (그니까 나누어진다면) arr에 그 요소를 추가하고 만약에 추가된게 없다면 (아무것도 나누어지지않았다면) -1이 나오게 만드는데
이걸 또 오름차순으로 정리하고 싶다고 한글로 적어두고,
일단 빈 배열을 선언한 뒤 for문을 주었다. 일단 길이보다 크면 안되니까,
그리고 조건문으로 나누어진다면 ~ 안나누어진다면~을 적은거 같다.
위에까지는 여렵지않았는데 오름차순을 할 때,
sort
메서드가 쓰인다는거는 알았지만 이걸 그래서 뭐 어떻게 하지 알아서 정렬이되나? 하고 a,b만 줬다가 통과 실패 (ㅋㅋㅋㅋㅋㅋㅋㅋ) 그래서 검색해서 찾아보니까 a-b했을때 양수면 a가 큰거니까 뒤로가고 음수면 a가 작은거니까 앞으로가는 식으로 오름차순을 주면 된다는 걸 알아냈다 !!!!!!!!!!! 그렇게 완성 !!!!!
문제 설명
명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.
아래 표는 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
이 문제를 보고나서 머리가 너무 아팠다. 그래 문제는 이해가 가는데 그래서 이걸 어떻게 하라는거지????????가 머리를 꽉 채웠다.
일단 여기서 가장 중요한 문장은 내가 봤을때
모든 명함을 수납 할 수 있는 가장 작은 지갑을 만든다.
이거였는데, 그래서 이걸 어떻게 응용해야할까 고민이 엄청 됐다.
그래서 일단은 모든 명함의 가로 중 가장 긴 값을 찾고, 세로 중 가장 긴 값을 찾으면, 그게 바로 지갑의 최종 가로 세로가 될 것이라는 생각까지 갔다. 그걸 곱하면 너비가 될 것이다.
그리고 "회전을 시켜서 더 긴 쪽을 사용 할 수 있다"라고 했으니까.
각 명함의 두 길이 중 더 큰 것을 가로, 작은 것을 세로로!
이게 내가 신경을 쓰지 못한 부분이었다. 회전이 된다.....!!!!!
function solution(sizes) {
let maxWidth = 0;
let maxHeight = 0;
sizes.forEach(size => {
const [w, h] = size;
const longer = Math.max(w, h);
const shorter = Math.min(w, h);
maxWidth = Math.max(maxWidth, longer);
maxHeight = Math.max(maxHeight, shorter);
});
return maxWidth * maxHeight;
}
일단 forEhch문으로 가로 세로 길이를 반복하게 만들고,
Math.max(w, h)로 큰 값을 찾아서 명함의 가로 길이로 하고, Math.min(w, h)로 작은 값을 찾아 세로 길이로 하게 했다.
그리고 maxWidth,maxheight로 가로 세로를 가져오고(?) 뭐라고 해야 할지 모르겠는데, 최대 가로 길이랑 최대 세로 길이를 찾았다.
이제 너비는 최대 가로 * 최대 세로를 리턴 !!!!!
이건 진짜 어려웠다. 일단 회전을 한다를 잊고서 하니까 포인트가 뭔지도 모르겠고 계속 가로중에서 고르고 세로중에서 골랐던거 같다.그래서 머리 터지고 화 박박 나고 그래도 포기 안하고 열심히 찾아 본 것 같다 어려워어어엉ㅇ