프론트엔드 스쿨 5기 TIL - 4월 13일 - Set

크롱·2023년 4월 17일
0

JavaSrcipt

목록 보기
25/53

🌈 Set

Set은 모든 타입의 값을 저장하는 객체자료형의 한 종류입니다.
중요📌객체 안의 값은 중복을 허용❌

Set은 차집합, 교집합과 같은 것을 구할때 사용된다!

<script>

let s = new Set('aabbbccccdd') // 중복을 제거하는구나!

console.log(s) // {'a','b','c','d'} 
s.size //4
s.has('a') //true
s.has('f') //false
s.add('z') //{'a','b','c','d','z'}

//거의 of로 순회합니다
for(const i of s) {
    console.log(i)
}
//a,b,c,d,z
</script>

👩‍💻 예제 1

<script>

회사게시판 = ['조셉','조셉','조셉','조셉','조셉','조셉','김연하','최흥석','이나영','김연하']

//문제1. 몇명이 게시판에 게시물을 썻나요?
let 게시자 = new Set(회사게시판) //{'조셉','김연하','최흥석','이나영'}
게시자.size //4명

//문제2. 각각 몇개의 게시물을 작성했나요?
for (const i of 게시자) {
    console.log(i, 회사게시판.filter(e => e === i)) 
    //i는 게시자 '조셉','김연하','최흥석','이나영'
    // e는 회사게시판
}

//결과
조셉 (6) ['조셉', '조셉', '조셉', '조셉', '조셉', '조셉']
김연하 (2) ['김연하', '김연하']
최흥석 ['최흥석']
이나영 ['이나영']

---------------------더 효율적이게---------------------------

for (const i of 게시자) {
    console.log(i, 회사게시판.filter(e => e === i).length)
}
//결과
조셉 6
김연하 2
최흥석 1
이나영 1

</script>

또다른 방식으로 풀기
이 풀이는 매우 어렵습니다

<script>

회사게시판 = ['조셉','조셉','조셉','조셉','조셉','조셉','김연하','최흥석','이나영','김연하']

let 게시자 = new Set(회사게시판) //{'조셉','김연하','최흥석','이나영'}

//문제1. 몇명이 게시판에 게시물을 썻나요?
////-------------이건 매우 어렵습니다. 초급자에게 권장하지 않습니다.
let map = new Map() 
//key와 value를 만들거에요. 현재 map에는 아무것도 없습니다.

for (const i of 회사게시판){
    map.set(i, (map.get(i) || 0)+1) //map.get(i) 이 undefined로 뜨면  0을선택.그리고+1
}
결과:  Map(4) {'조셉' => 6, '김연하' => 2, '최흥석' => 1, '이나영' => 1}

-----------------------------------------------
//풀이
//1번째 순회 i에 '조셉'
map.set(i, (map.get(i) || 0)+1)
// let map = new Map() 하고 map.get('조셉') //undefined
map.set('조셉',1) //최종

//2번째 순회 i에 '이호준'
map.set(i, (map.get(i) || 0)+1)
map.set('조셉',2) //최종
</script>

Set에서 NaN

<script>
회사게시판 = ['이호준','이호준',NaN,NaN]

let test= new Set(회사게시판) 
//{'이호준',NaN }// 원래는 NaN이 두개가 나와야함. NaN !== NaN이므로.
//근데 set에서는 같은걸로표현.
</script>


👩‍💻 split 활용과 Set의 forEach

<script>
'aabbbccccdd'.split('') // ['a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'd', 'd']

//두개가 같은거에요
let s = new Set('aabbbccccdd'.split(''))
let s = new Set(['a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'd', 'd']) 

s // Set(4) {'a', 'b', 'c', 'd'}

//set의 forEach는 인자에 value가 두번반복입니다.
s.forEach((a,b,set)=> { 
   console.log(a,b,set) 
})


a a Set(4) {'a', 'b', 'c', 'd'}
b b Set(4) {'a', 'b', 'c', 'd'}
c c Set(4) {'a', 'b', 'c', 'd'}
d d Set(4) {'a', 'b', 'c', 'd'}


</script>



👩‍💻 교집합 합집합 차집합

교집합

<script>

  let a = new Set('abc') // Set(3) {'a', 'b', 'c'}
  let b = new Set('cde') // Set(3) {'c', 'd', 'e'}

  a // Set(3) {'a', 'b', 'c'}
  [...a]  // ['a','b','c'] 배열로 만들어야 배열메소드를 이용할수있습니다.

  let 교집합 = [...a].filter(e=>b.has(e)) //['c']

</script>


합집합

잠깐 상식! concat이란?

let a = [1,2,3]
let b = [4,5,6]
a.concat(b)
//[1, 2, 3, 4, 5, 6]
b.concat(a)
//[4, 5, 6, 1, 2, 3]

사실 [...a,...b] 을 더 많이씁니다.
[1, 2, 3, 4, 5, 6]

<script>
let a = new Set('abc')
let b = new Set('cde')

let union = new Set([...a,...b]) 
[...a,...b] // ['a', 'b', 'c', 'c', 'd', 'e']
//union // {'a','b','c','d','e'}

이렇게 concat으로 풀어도 됩니다.
let union = new Set([...a].concat(...b)) 
</script>


차집합

<script>

  let a = new Set('abc')
  let b = new Set('cde')
  let 차집합 = [...a].filter(e => !b.has(e)) 
  //['a', 'b']

</script>


🌃 이터러블한 객체

  • 이터러블한 객체란? 순회가 가능한 객체다.
    set, map, array, string
  • 즉, 넣은순서대로 순회할수있으냐 set,map, array, string이 순서를 보장한다.
  • object는 순서를 보장하지 않습니다.

💻 프로그래머스 풀이

<script>
// https://school.programmers.co.kr/learn/courses/30/lessons/120903
// 교집합의 갯수 구하는 문제
function solution(s1, s2) {
    return s1.length + s2.length - new Set([...s1, ...s2]).size;
}

function solution(s1, s2) {
    s1 = new Set(s1)
    s2 = new Set(s2)
    let cro = [...s1].filter(e => s2.has(e))
    return cro.length;
}

// https://school.programmers.co.kr/learn/courses/30/lessons/120891

function solution(order) {
    const mySet = new Set([3, 6, 9]);
    return String(order) // '29423' 
        .split("") // ['2', '9', '4', '2', '3']
        .filter((num) => mySet.has(parseInt(num))).length;
}

// https://school.programmers.co.kr/learn/courses/30/lessons/120852
function solution(n) {
    let answer = [];

    let i = 2;
    while (i <= n) {
        if (n % i === 0) {
            answer.push(i);
            n = n / i;
        } else {
            i++;
        }
    }

    return [...new Set(answer.sort((a, b) => (a > b ? 1 : -1)))];
}

</script>
profile
👩‍💻안녕하세요🌞

0개의 댓글