안녕하세요!
set.. set...! set을 자주 쓰지만 왜? 어떻게 되는지.. 알지 못했다 무지했다 왜 그랬을까..?
우선 Set에 문서를 확인해보면
Set 객체는 자료형에 관계 없이 원시 값과 객체 참조 모두 유일한 값을 저장할 수 있습니다.
라고 되어있습니다.. 설명으로는
Set 객체는 값 콜렉션으로, 삽입 순서대로 요소를 순회할 수 있습니다. 하나의 Set 내 값은 한 번만 나타날 수 있습니다. 즉, 어떤 값은 그 Set 콜렉션 내에서 유일합니다.
삽입 순서대로 요소를 순회한다고 합니다. 그리고 Set내에선 한번만 나타낼 수 있다고 하네요! 수학을 배운사람이라면 셋 (집합) 이 뭔지 알 수 있지만, 그렇지 않은 사람은 알 수 없으니..
set의 메소드로는 add, clear, delete, entries, forEach, has, keys, values 가 있습니다. 우리가 아는 배열은 push로 데이터를 삽입하지만 set은 add를 사용해야 합니다.
set의 add는 연속으로 사용할 수 있습니다.
const set = new Set(); set.add(1).add('bangul').add(25) // Set [1, 'bangul', 25]
이렇게 add 에 add.add.add 를 사용할 수 있다는 말이죠!
다음 set의 clear()는 말그대로 set객체를 비워줍니다.
set에서 재밌게 사용할 수 있는 delete()의 경우에는 set의 객체를 제거합니다. 근데! 여기에 delete(value)에 value를.. set안에 있는 데이터로 넣으면 그게 지워진다는 사실!!
const set = new Set(); set.add(1).add(3).add(18); // 3제거 set.delete(3) console.log(Array.from(set)); // [1, 18]
어떤가요? 좋죠..
그리고 배열처럼 forEach()도 사용이 가능하다는 사실!!
그리고 또하나, set에 지금 value가 있는지 알아보는 has도 있답니다.
const set = new Set([1, 2, 3, 4, 5]); console.log(set.has(1)); // expected output: true console.log(set.has(5)); // expected output: true console.log(set.has(6)); // expected output: false
우와... 하지만 set도 결국 집합이기 때문에 배열로 뽑으려면 배열로 변환시켜주어야 합니다.
코딩테스트를 풀때 Set을 사용할때도 있습니다. 만약 중복의 값을 제거한 내용들만 저장하고 그 수를 return 해야하는 경우에는 Set.size를 사용해 길이를 반환할 수 있습니다. 하지만 중복을 제거한 내용을 return 해야한다면 Array.from()을 사용해서 배열의 형태로 변환해줘야 합니다.
한가지 문제를 예시로 풀어보도록 하겠습니다.
// 문제 // 주어진 배열안에 내용들은 정렬되어있다. // m개의 배열안엔 각 길이가 다른 n개의 배열들이 있다. // 중복을 허용하지 않고, 순서대로 배열을 출력하는 answer를 반환하여라. // ex1) input: [[3, 4], [1, 2], [1, 2, 3]] output : [1, 2, 3, 4] // ex2) input: [[1, 2, 3, 3], [1, 6], [2, 3, 4, 5]] output : [1, 2, 3, 4, 5, 6]const sol = (nums) => { // 집합을 하나 만든다.const set = new Set() for (let i = 0; i < nums.length; i++) { for (let j = 0; j < nums[i].length; j++) { set.add(nums[i][j]) } } return Array.from(set).sort((a, b) => a - b) }
위의 방식대로 set에 데이터값들을 하나씩 넣고, 그 수를 정렬해주어야 합니다. 왜냐하면 set에는 먼저 들어간 순서대로이기 때문에 ex1을 예제로 들면 set을 정렬하지 않았을 때 set에는 [3, 4, 1, 2]로 쌓여있을것입니다. 그렇기에 set을 정렬해서 return 해주는 것이죠.
set.. 좋은데 좀더 당당하게 말할만큼 잘 알고 있어야 한다.. 뭐든지 깊게 파도록 하는 습관을 들입시다!
깃허브도 함 방문해주세여.. 별도 마구마구 눌러주고..
이상 감사합니당