Reduce 사용을 생활화하쟈..!
중앙값은 어떤 주어진 값들을 크기의 순서대로 정렬했을 때 가장 중앙에 위치하는 값을 의미합니다. 예를 들어 1, 2, 7, 10, 11의 중앙값은 7입니다. 정수 배열 array가 매개변수로 주어질 때, 중앙값을 return 하도록 solution 함수를 완성해보세요.
sort 메서드를 이용하여 오름차순 정렬을 한 후, arr의 length의 반절값을 사용하여 배열의 중간값을 구한다. 이 때, arr의 길이는 홀수이므로 Math.floor
로 소수점내림을 해주었다.
function solution(arr) {
return arr.sort((a, b) => a - b)[Math.floor(arr.length / 2)];
}
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
[1, 2, 3, 3, 3, 4]에서 1은 1개 2는 1개 3은 3개 4는 1개로 최빈값은 3입니다.
[1, 1, 2, 2]에서 1은 2개 2는 2개로 최빈값이 1, 2입니다. 최빈값이 여러 개이므로 -1을 return 합니다.
[1]에는 1만 있으므로 최빈값은 1입니다.
[1, 2, 3, 3, 3, 4] 라는 배열에서 최빈값을 찾는다고 생각해봤을때,
먼저 새로운 객체(stockObj)를 생성하여 각 key값의 value에 빈도수를 나타내었다.
ex) {1: 1, 2: 1, 3: 3, 4: 1}
그리고 resArr 라는 stockObj의 value값을 담은 배열을 생성하였다.
ex) [1,1,3,1]
그 후 최빈값이 두 개 이상일 때, 한 개 일때의 경우로 나누어 생각하였다.
최빈값이 두 개 이상이면 -1을 리턴해야 했으므로 resArrf를 sort정렬 하여 value를 오름차순으로 정렬하였다. 그래서 배열의 마지막요소와 마지막-1 요소가 같으면 -1을 리턴하도록 하였다.
최빈값이 한 개 이면 maxValue값(3
)을 구한 후 미리 생성한 객체의 key,value 값과 비교하여 객체의 key값을 리턴해주었다.
function solution(arr) {
let stockObj = {};
for (let i in arr) {
if (!stockObj[arr[i]]) stockObj[arr[i]] = 0;
stockObj[arr[i]]++;
}
let resArr = Object.values(stockObj);
let maxValue = Math.max.apply(null, resArr);
resArr.sort((a, b) => a - b);
// 최빈값이 두 개 이상일 때
if (resArr[resArr.length - 2] === resArr[resArr.length - 1]) {
return -1;
}
// 최빈값이 한 개일 때
for (let j in stockObj) {
if (Number(stockObj[j]) === Number(maxValue)) return Number(j);
}
}
✏️ 다른사람들의 풀이를 보았는데 처음 stockObj 객체를 생성할 때 for of 구문과 논리합연산자를 사용한 것과 reduce를 사용한 걸 보고 한번 더 놀랐다...reduce랑 어서 친해져야 할텐데...!
그리고 최빈값의 갯수에 따라 분기 할 때 삼항연산자
로 로직을 변경 할 수 있었는데 그렇게 되면 코드도 무척 간단해지고 가독성이 높아지는 것 같다.
하기는 다른 분의 코드인데 긁어와보았다...
function solution(array) {
const freq = {};
for (const n of array) {
freq[n] = (freq[n] || 0) + 1;
}
const keys = Object.keys(freq);
keys.sort((a,b) => freq[b] - freq[a]);
const max = keys[0];
return freq[keys[0]] === freq[keys[1]] ? -1 : +max;
}
정수 n이 매개변수로 주어질 때, n 이하의 홀수가 오름차순으로 담긴 배열을 return하도록 solution 함수를 완성해주세요.
짝수를 배제해야하므로 i의 초기값을 1로 주었다.
i가 n이하일 때 까지만 i에 +2를 하면서 answer 배열에 push 해주었다.
function solution(n) {
let i = 1;
let answer = [];
while (i <= n) {
answer.push(i);
i = i + 2;
}
return answer;
}