주어진 배열중에서 가장 많이 나오는 '값'을 찾아 리턴하면 된다!!!
만약에 자주나오는 값이 두개이상 겹치면 -1 리턴하면 된다!!!
또 만약에 주어진 배열 길이가 1이면 그냥 그 값 리턴하면 된다!!!
여기서 또 이렇게 고생하다니...
대충 막 풀었던 답 1
아무튼 배열에서 값끼리 비교해서 중복이면 임시배열에 담고
set으로 중복제거 해서 풀어보려했지만
점수는 43.8 점 이었다...
function solution(array) {
let answer = 0;
let temp;
let arr = [];
for(let i = 0; i < array.length; i++){
if(i > 0 && array[i] === temp){
arr.push(temp);
arr.push(array[i]);
}
temp = array[i];
}
const final = Array.from(new Set(arr));
if(final.length === 1){
answer = final[0]
}else if(final.length > 1){
answer = -1;
}else if(final.length === 0){
answer = array[0]
}
return answer;
}
삽질하다가 1,1,2,2,2 같은 배열이 들어오면 2가 세개니까 2를 잡아내야하는데
set에서 1,2 로 되면서 마치 1,1,2,2 에서처럼 최빈값 중복으로 판단되며 오답이 난 것 같다...
그래서... reduce 에 Object.values 에 entries 에 있는대로 동원해서 아무튼 풀었다...
function solution(array) {
let answer = 0;
const arr = [];
const countedNumbers = array.reduce(function (allNumbers, number) {
if (number in allNumbers) {
allNumbers[number]++;
} else {
allNumbers[number] = 1;
}
return allNumbers;
}, {});
const max = Math.max(...Object.values(countedNumbers));
for(const [key, value] of Object.entries(countedNumbers)){
if(value === max){
arr.push(Number(key));
}
}
if(arr.length === 1){
answer = arr[0];
}else if(arr.length > 1){
answer = -1;
}
return answer;
}
다른분들의 풀이도. 쉽지는 않다...
가독성도 좋고 제일 괜찮아보이는 것은 요것이다.
const solution = (array) => {
const counter = array.reduce((acc, cur) => ({
...acc,
[cur]: (acc[cur] || 0) + 1
}), {})
const items = Object.keys(counter).map((key) => [
Number(key), counter[key]
]).sort((a, b) => b[1] - a[1])
if (items[0][1] === items?.[1]?.[1]) {
return -1
}
return items[0][0];
}
좀 더 공부 필요,.,..
'algorithm' 카테고리의 다른 글
코테13 - 짝수는 싫어요 (0) | 2024.03.21 |
---|---|
코테12 - 문자열 밀기 (0) | 2024.03.21 |
코테10 - 중앙값 구하기 (0) | 2024.03.10 |
코테9 - 피자 나눠먹기 (0) | 2024.03.10 |
코테8 - 종이자르기 (0) | 2024.03.10 |