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;
};
복사했습니다!