프로그래밍 이야기/파이썬 코딩 테스트 스터디

파이썬 코딩테스트 스터디 7주차 #1 - 집합

hoony926 2024. 8. 4. 14:52

 

1. 집합과 상호배타적 집합의 개념

집합의 개념

 

집합은 순서와 중복이 없는 원소들을 갖는 자료 구조.

ex)

A그룹 = {1,6,6,6,4,3} 이면 집합은 {1,6,4,3} or {6,1,3,4} or {3,6,1,4} ...등등

중복 제거, 순서 상관 X

 

집합의 종류

상호배타적 집합 : 교집합이 없는 집합 관계

 

2. 집합의 연산

배열을 활용한 트리로 집합 표현하기

집합은 배열을 활용한 트리로 구현. 

 

대표원소란?

집합의 원소 중 집합을 대표하는 역할. 

트리로 표현할 때는 루트 노드

 

배열로 집합을 표현하는 것이란?

하나의 배열로 상호 배타적 관계를 가지는 집합을 모두 표현한다

즉 2개의 집합(교집합이 없는)을 1개 배열로 다 나타내는 방법. 

배열의 인덱스는 자신을, 값은 부모 노드를 의미

 

 

코딩 테스트 합격자 되기 : 파이썬 편 - 338page

 

이때 배열의 크기는 반드시 가장 큰 원소(여기서는 9)에 +1 한만큼 잡아야한다

 

집합 표현 완벽 정리하기

코딩 테스트 합격자 되기 : 파이썬 편 - 339page
코딩 테스트 합격자 되기 : 파이썬 편 - 339page

 

 

위의 집합 A , B를 배열로 실제 구현할 때 

1. 여기서는 가장 큰 노드가 9인데 배열의 크기를 9로 잡았다.

    (이 부분이 크게 상관없는듯하다.)

2. 각 인덱스 값을 우선 자기 자신으로 초기화(만약 없는 원소의 인덱스를 -1로 초기화)

코딩 테스트 합격자 되기 : 파이썬 편 - 339page

 

집합 A의 경우 9→3 →2 →1 

이 순서 이동

코딩 테스트 합격자 되기 : 파이썬 편 - 340page

 

 

 

유니온-파인드 알고리즘

집합 알고리즘에 주로 쓰이는 연산은 합치기와 탐색.

합치기 = union

탐색 = find

 

파인드 연산

특정 노드의 루트 노드가 무엇인지 탐색하는 방법.

특정 노드가 같은 집합에 있는지 확인하는 데 사용.

ex) A,B 두 노드가 있는데 이 노드의 루트 노드가 서로 같다면, 

     이 두 원소는 같은 집합에 속함. 보통 재귀로 찾음

 

1. 현재 노드의 부모 노드 확인. 

2. 부모 노드가 루트 노드면, 연산 종료

3. 부모 노드가 루트 노드 아니면, 1 반복

코딩 테스트 합격자 되기 : 파이썬 편 - 341page

 

파인드 연산의 연산 비용 문제, 경로 압축으로 해결

 

코딩 테스트 합격자 되기 : 파이썬 편 - 342page

 

합치기 연산

두 집합을 하나로 합치는 연산. 

Meaning? 두 집합의 루트노드를 같게 즉, 한쪽이 다른 한쪽에 속하는 방식. 

 

1. 두 집합에서 찾기 연산을 통해 루트노드 찾는다.

2. 찾은 두 루트 노드의 값을 비교

3. 다르다

  3-1 높이가 같다

      - 한쪽 루트 노드를 다른 쪽 루트 노드의 바로 아래에 붙인다. 

  3-2 높이가 다르다

      - 랭크 값이 큰(높이가 큰) 루트 노드가 전체의 루트노드가 되어 

        랭크 값이 작은 집합의 루트 노드를 큰 집합의 루트 노드의 자식 노드로 붙힌다.

 

   

코딩 테스트 합격자 되기 : 파이썬 편 - 346page

 

끝!

 


♬ 자료 출처 - 책

코딩 테스트 합격자 되기 - 파이썬 편

 

 

 

이 포스팅의 모든 내용은 해당 책의 내용을 바탕으로 하고 있습니다. 

감사합니다.