문제 설명
이 문제에서 두 정수 배열의 대소관계를 다음과 같이 정의합니다.
- 두 배열의 길이가 다르다면, 배열의 길이가 긴 쪽이 더 큽니다.
- 배열의 길이가 같다면 각 배열에 있는 모든 원소의 합을 비교하여 다르다면 더 큰 쪽이 크고, 같다면 같습니다.
두 정수 배열 arr1과 arr2가 주어질 때, 위에서 정의한 배열의 대소관계에 대하여 arr2가 크다면 -1, arr1이 크다면 1, 두 배열이 같다면 0을 return 하는 solution 함수를 작성해 주세요.입출력 예
arr1 arr2 result [49, 13] [70, 11, 2] -1 [100, 17, 84, 1] [55, 12, 65, 36] 1 [1, 2, 3, 4, 5] [3, 3, 3, 3, 3] 0
일단 매개변수로 배열 두개가 들어온다.
a. 두 배열의 길이(원소개수)가 다른가?
b. 두 배열의 길이(원소개수)가 같은가?
결론: a분기 => b분기를 거쳐 조건에 따라 1,0,-1을 도출해야 하는 문제이다.
function solution(arr1, arr2) {
//두 수의 크기를 비교하는 함수
const compareLength = (a,b) => a > b ? 1 : a < b ? -1 : 0;
//두 배열의 총합을 비교하는 함수
const compareSum = () => {
const sumArr1 = arr1.reduce((acc,cur) => acc + cur,0);
const sumArr2 = arr2.reduce((acc,cur) => acc + cur,0);
return compareLength(sumArr1,sumArr2);
}
return compareLength(arr1.length,arr2.length) == 0 ? compareSum() : compareLength(arr1.length,arr2.length);
}
최근에 재귀함수란 것을 새롭게 알게 되어서 어떤 문제를 볼때마다 어,이거 재귀함수로 만들어볼까?하는 뻘짓을 하게 되었다.
그런데 역시 익숙한 방식대로 임의의 함수를 돌리는게 더 이해가 빠르게 되는 것 같다.
처음에는 reduce
함수를 한개로 합칠수 있지 않을까..싶었는데 역시 무리일지도.
첫 번째 조건을 통과하는 시점을 어떻게 가를지 약간 고민한 편이다.
const solution = (arr1, arr2) => {
return arr1.length !== arr2.length ? compare(arr1.length, arr2.length) : compare(arr1, arr2, "reduce");
};
const compare = (a, b, option) => {
if (option === "reduce") {
a = a.reduce((acc, cur) => acc + cur);
b = b.reduce((acc, cur) => acc + cur);
}
return a > b ? 1 : a < b ? -1 : 0;
};
어떤 분은 이렇게 solution 함수 바깥에 파라미터를 한개 더 받는 함수를 작성하셔서, 깔끔하게 처리하셨다.
옵션 파라미터를 넣는 방법 괜찮은것 같다!