/**
* @param {number[]} nums
* @return {number}
*/
var numIdenticalPairs = function(nums) {
nums.sort();
let pair = 0;
let count = 0;
for (let i = 1; i < nums.length; i++) {
if (nums[i] !== nums[i - 1]) {
pair += ((count + 1) * count) / 2;
count = 0;
} else {
count++;
}
}
pair += ((count + 1) * count) / 2;
return pair;
};
안좋은 답안이라고 생각하면서도 작성한 답안...
각 아이템들이 몇개있는지를 구해서 (count * (count-1))/2 를하면 pair 갯수를 구하는거까진 생각했는데 합리적인 코드를 생각해내지 못했다.
// time O(N) space O(N)
var numIdenticalPairs = function(nums) {
const map = {}
let count = 0
for (const number of nums) {
if (map[number]) {
count += map[number];
map[number] += 1;
} else {
map[number] = 1;
}
}
return count
};
각 아이템의 갯수를 세면서 또 있으면 저장해뒀던 갯수를 더하는식...
function numIdenticalPairs(nums) { // O(n)
const map = nums.reduce((m, n, i) => m.set(n, (m.get(n)||0) + 1), new Map());
return [...map.values()].reduce((num, n) => num + n * (n - 1) / 2, 0);
};
reduce로 각 아이템 갯수를 map에 저장하는 로직은 찾아봤었다.
갯수를 저장한 map을 reduce로 공식을 합하면 되는거였는데... 여기까지 생각못한게 아쉽..