중복값 제거하기

savazy_gg·2023년 3월 30일
0

알고리즘

목록 보기
1/1

자바스크립트 문법에 익숙해지기 위해 알고리즘 문제들을 풀고있다.
(저번주엔 총 110문제를 풀었다..)
확실히 양으로 승부하니 내가 어디부분이 약한지, 어느 부분을 잘 모르고 있었는지를 체크할 수 있었다.

특히 내가 약한부분은 객체 다루기인데, 원래 중복값 제거는 set으로 했지만 frequecy map으로도 풀 수도 있어서 객체 연습겸 강의로 들어보았다.

참고강의) https://www.youtube.com/watch?v=zbH7YqUxFpA&list=PL3xNAKVIm80KhJzoz0N5VPROJq3IoLBIW

일단, 이곳에서 나온 방법 모두 소개하자면

  1. Set()

내가 제일 애용하는 방법이다. 항상 중복값제거 문제나오면 set으로 풀었다.. (너무 편리,,)

const nums = [1,2,3,6,6,7,2,2,8,9]
const mySet =[...new Set(nums)]
console.log(mySet)// [1,2,3,6,8,9]

너무너무 간단하게 중복값제거가 된다!

  1. indexOf()

indexOf(item)이렇게 괄호안에 내가 찾고자하는 값을 넣어주면 해당 값을 찾아 index를 반환해주는 함수다.(찾아진 값이 여러개라면 처음 찾아진 값의 index를 반환한다)
해당 기능을 활용하여

> const nums = [1,2,3,6,6,7,2,2,8,9]
const unique = nums.filter((item, position) => nums.indexOf(item) === position)

console.log(unique)//[1,2,3,6,7,8,9]

indexOf는 가장 처음으로 나타는 index를 가져옴으로 검사하고 있는 원소의 index와 비교하여 같을 경우에만 true를 리턴을 하게된다.
즉 item, position으로 본다면 filter를 통해 1,0 2,1 3,2 6,3 6,4로 돌게 되는데
이때, nums.indexOf(item) === position 여기서 indexOf(6)은 3임으로 6,4를 가진 두번째 6은 position과 indexOf(6)이 같지 않음으로 중복값이 제거되며 unique배열이 만들어진다.

*강의에서 사진은 가져왔음

  1. frequency map

그리고 내가 가장 약한 부분.. 들었을땐 이해가 갔지만 혼자 풀다가 이해가 안가는 부분이 있었는데, 일단 코드를 보자면

const nums = [1,2,3,6,6,7,2,2,8,9]
function uniqueNums(arr){
    const uniqueElements = {};
    const result = [];
    for(let element of arr){
        console.log(result,uniqueElements)
        if(!uniqueElements[element]){
            result.push(element)
        }
        uniqueElements[element] = element 
    }
    
    return result;
}

console.log(uniqueNums(nums))//[1,2,3,6,7,8,9]

여기서 나는 uniqueElements[element] = element 이 부분이 이해가 안갔다. 중복값인지 체크해주는 부분은 if(!uniqueElements[element]) 이 부분인데 왜 저 라인이 필요한지를 이해를 못한 것이다.

구글링해봐도 일치하는 예시가 없어서 이거 이해하려다가 다른거 또 몰라서 다른거 찾아보고 그러다가 또 모르는거 나와서 또 다른거 찾아보는.. 그런.. 타고타고가는 궁금증만 생겨버려서

이에 stackoverflow에도 글을 올리게되었다.
질문글) https://stackoverflow.com/questions/75862661/removing-duplicate-value-caching-frequency-map-solving/75863267#75863267
(처음으로 스택오버플로우를 이용해봤는데, 생각보다 너무 진심으로 자세하게 잘 알려주셔서 너무 감사하게 봤다.)

즉, uniqueElements[element] = element반복되는 모든 요소를 ​​추적하는 데 사용되는 객체이고,
if (!uniqueElements[element]) {}은 현재 요소가 해당 객체에 없는지 확인하고 요소를 배열로 푸시하는 역할 인 것이다.

그리고 가장 중요한 포인트!!
객체의 키는 중복을 가질 수 없습니다. 존재하는 키에 값을 할당하면 새 값이 이전 값을 대체합니다.

해당 배열을 예로들면
const nums = [1,2,3,6,6,7,2,2,8,9]
if (!uniqueElements[element]) 여기서 현재 요소가 해당 객체에 없는지 확인하고 요소를 배열로 푸시를 하게 되고,
uniqueElements[element] = element 해당 부분을 통해
uniqueElements = {1 : 1, 2 : 2, 3 : 3, 6 : 6, ..} 이렇게 객체가 생성되는데 이후 2번째 6에서도 6 : 6으로 첫번째 6과 중복이 되며 객체에서 중복값이 제거 되는 것이다.

만약에 uniqueElements[element] = element 해당 라인이 없다면 객체가 만들어지지 않기 때문에 비교할 값이 없어지며 중복값이 제거되지 않은 [1,2,3,6,6,7,2,2,8,9] 배열이 리턴되게 된다.

이런 형식을 조금더 간단히 표현한 풀이도 있다.

const uniqueNums = arr => {
  const uniqueElements = {};
  arr.forEach(element => uniqueElements[element] = element); // same as your uniqueElements[element] = element
  return Object.values(uniqueElements); // return just the values - Object.keys would return an array of strings
}
console.log(uniqueNums([1, 2, 3, 4, 3, 2, 1]))

해당 알고리즘을 frequency map으로 풀어보는 방법을 보고 이해하지 못했던 부분을 하나씩 알아가니 조금은 객체에 알아가는 느낌이 드는것같기도...? (아직도 갈 길은 멈)

profile
열정 열정 열정 ~~@!

0개의 댓글