문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
메모
- Map: Map 객체는 키-값 쌍과 키의 원래 삽입 순서를 기억한다. 모든 값(객체 및 원시 값 모두)은 키 또는 값으로 사용될 수 있다.
- Spread syntax(...): 배열이나 문자열과 같이 반복 가능한 문자를 0개 이상의 인수(함수로 호출할 경우)나 요소(배열 리터럴의 경우)로 확장하여, 0개 이상의 키-값의 쌍으로 객체로 확장시킬 수 있다.
- Array.length: 배열의 길이를 반환한다. 반환값은 부호 없는 32비트 정수형이며, 배열의 최대 인덱스보다 항상 크다. length 속성에 값을 설정할 경우 배열의 길이를 변경한다.
- 증가 연산자(++): 피연산자를 증가(1을 더함)시키고 연산자의 위치에 따라 증가하기 전이나 후의 값을 반환한다.
- Array.prototype.indexOf(): 배열에서 지정된 요소를 찾을 수 있는 첫 번째 인덱스를 반환하고 존재하지 않으면 -1을 반환한다.
- Array.prototype.lastIndexOf(): 배열에서 주어진 값을 발견할 수 있는 마지막 인덱스를 반환하고, 요소가 존재하지 않으면 -1을 반환한다. 배열 탐색은 fromIndex에서 시작하여 뒤로 진행한다.
정답
function solution(array) {
let obj = {};
// 객체에 값이 없으면 1로 선언하고, 없으면 1을 더한다
array.map(x => {
obj[x] === undefined ? (obj[x] = 1) : obj[x]++;
});
// 값 배열의 최댓값
let max = Math.max(...Object.values(obj));
// 값 배열을 키 배열의 최댓값으로 필터링
let valueArr = Object.values(obj).filter(x => x === max);
// 객체에서 값 배열의 최댓값과 일치하는 키 찾기
let answer = Number(Object.keys(obj).find(x => obj[x] === max));
// 최댓값인 키가 2개 이상이면 -1 출력, 그렇지 않으면 key 출력
return valueArr.length > 1 ? -1 : answer;
}
function solution(array) {
let map = new Map();
// Map 객체 초기화
for (i = 0; i <= Math.max(...array); i++) {
map.set(i, 0);
}
// array 배열의 원소값과 일치하는 Map 객체의 key를 증가시킨다
for (i = 0; i < array.length; i++) {
map.set(array[i], map.get(array[i]) + 1);
}
// Map 객체의 value만 모아서 배열로 만든다
let arr = Array.from(map.values());
// 최대값 산출
let max = Math.max(...arr);
// 최대값이 하나면 max, 여러 개 중복되면 -1 출력
if (arr.indexOf(max) !== arr.lastIndexOf(max)) {
return -1;
} else {
return arr.indexOf(max);
}
}
console.log(solution([1, 1, 2, 2])); // -1