1. 문제 해설
Input: arr = [1,2,2,1,1,3]
Output: true
Explanation: The value 1 has 3 occurrences, 2 has 2 and 3 has 1. No two values have the same number of occurrences.
Input으로 배열이 주어지는데 주어지는 배열에 각 원소 개수(위 예시에서 1의 개수는 3개, 2의 개수는 2개, 3의 개수는 1개) 들이 중복되지 않는다면 true 중복된다면 false를 반환하는게 문제입니다.
2. 내가 푼 코드
const uniqueOccurrences = function(arr) {
const uniqueMap = new Map();
for(let i = 0; i<arr.length; i++) {
const nowNum = arr[i]
if(!uniqueMap.get(nowNum)) {
uniqueMap.set(nowNum, 1)
} else {
uniqueMap.set(nowNum, uniqueMap.get(nowNum) + 1)
}
}
let values = [...uniqueMap.values()]
let result = true
while(values.length) {
const Element = values.shift();
if(values.includes(Element)) {
result = false
break;
}
}
return result
};
처음 해결할 때는 Object를 만들어 각 원소값을 key로 설정한 뒤 object[키값]으로 접근하여 값이 있으면 +1 없으면 추가하는 방식으로 구현해서 해결했지만 비슷한 기능을 하는 Map 자료구조가 있어 다시 해결하였습니다
Map 자료구조의 특징은 https://choiblog.tistory.com/10 정리해두었고 가장 큰 차이는 반복문으로 사용할 수 있다는 점이지만 위 문제를 해결할 때 접근하는 방식이 헷갈려서 배열로 복사시켜 해결하였습니다
하지만 반복문을 두번 사용해서 그런지 런타임측면에서 성능이 매우 떨어졌고 이후에 남이 푼 코드에서 새로운 자료구조를 공부하며 해결해볼 예정입니다
3. 남이 푼 코드
Map보다는 Set을 활용하였으며 Set 방식은 자세히 알지 못해서 정리해둘 예정입니다
const uniqueOccurrences = function (arr) {
const map = new Map();
for (const num of arr) map.set(num, (map.get(num) || 0) + 1);
return new Set([...map.values()]).size == map.size;
};
'알고리즘' 카테고리의 다른 글
Leetcode - 495. Teemo Attacking (0) | 2022.06.13 |
---|---|
Leetcode - 1732. Find the Highest Altitude (0) | 2022.06.12 |
Javascript Map object (0) | 2022.06.09 |
Leetcode - 1773. Count Items Matching a Rule (0) | 2022.06.08 |
Leetcode - How Many Numbers Are Smaller Than the Current Number (0) | 2022.06.07 |