코딩라이브러리/파이썬

파이썬 중복제거 set 집합함수 (with 백준 2776)

유니네 라이브러리 2024. 5. 29. 19:23

중복을 제거하고 싶다면 set()을 활용한다

set()은 리스트를 집합으로 변환하며, 자동으로 중복된 요소를 제거한다.

집합 연산(교집합, 합집합, 차집합)도 쉽게 처리할 수 있다.

 

📌 set() 함수란?

 

set() 함수는 집합 자료형을 생성하는 함수이다.

집합은 중복을 허용하지 않으며, 순서가 없는 자료형이다.

 

📌 set(iterable) → iterable(반복 가능한 객체)을 집합으로 변환

a = [2, 1, 3, 4, 5, 5, 6, 7, 3]
unique_a = set(a)

print(unique_a)  # {1, 2, 3, 4, 5, 6, 7}
print(len(unique_a))  # 7 (중복 제거됨)

 

📌 리스트에서 중복 제거하기

 

📌 리스트를 set()으로 변환 → 다시 리스트로 변환

a = [2, 1, 3, 4, 5, 5, 6, 7, 3]
b = ['lee', 'yun', 'park', 'yun', 'bang', 'lee']

# 중복 제거
unique_a = list(set(a))
unique_b = list(set(b))

print(unique_a)  # [1, 2, 3, 4, 5, 6, 7]
print(unique_b)  # ['bang', 'yun', 'lee', 'park']

 

📌 집합 연산 (set 연산 메서드)

 

집합을 활용하면 교집합, 합집합, 차집합 연산을 쉽게 할 수 있다.

a = {'lee', 'yun', 'park'}
b = {'yun', 'bang', 'lee'}

# 교집합 (intersection)
print(a.intersection(b))  # {'yun', 'lee'}

# 합집합 (union)
print(a.union(b))  # {'lee', 'bang', 'yun', 'park'}

# 차집합 (difference)
print(a.difference(b))  # {'park'}
print(b.difference(a))  # {'bang'}

 

📌 set() vs frozenset() 차이점

함수 특징
set() 가변형 (요소 추가/삭제 가능)
frozenset() 불변형 (요소 추가/삭제 불가능)
# set은 요소 추가 가능
mutable_set = set(['lee', 'yun', 'park'])
mutable_set.add('bang')
print(mutable_set)  # {'lee', 'yun', 'park', 'bang'}

# frozenset은 요소 추가 불가능 (오류 발생)
immutable_set = frozenset(['lee', 'yun', 'park'])
immutable_set.add('bang')  # AttributeError 발생

 

📌 set() 활용 - 백준 2776번 (암기왕 문제)

 

 문제링크 🔗 백준 2776번 - 암기왕

 

📝 문제 설명

  • 수첩1에 적힌 숫자가 수첩2에 있는지 확인해야 함.
  • set()을 사용하면 탐색 속도를 O(1)으로 빠르게 처리할 수 있음.

💡 해결 방법

 

set()을 사용하여 수첩1을 집합으로 변환 → 빠르게 탐색 가능

sys.stdin.readline()을 사용하여 입력 속도 최적화

 

🔹 코드 구현

import sys
#입력값 받기
T = int(sys.stdin.readline().rstrip())
#문제풀이 Set() 사용
for i in range(0, T):

    # 수첩1 입력 (set으로 변환하여 중복 제거)
    cnt1 = int(sys.stdin.readline().rstrip())
    memo1 = set(map(int,sys.stdin.readline().rsplit()))
    
    # 수첩2 입력
    cnt2 = int(sys.stdin.readline().rstrip())
    memo2 = list(map(int,sys.stdin.readline().rsplit()))
    
    # 수첩2의 요소가 수첩1에 있는지 확인
    for j in memo2:        
        if j in memo1:
            print(1)
        else:
            print(0)

 

🔹 실행 예제

 

입력

1
5
4 1 5 2 3
5
1 3 7 9 5

 

출력

1
1
0
0
1

 

📌 마무리 - 정리

 

set()을 활용하면 중복 제거와 **빠른 탐색(O(1))**이 가능

set()을 활용하면 교집합, 합집합, 차집합 연산이 편리

set()가변형, frozenset()불변형

백준 2776번(암기왕) 문제를 통해 set()을 실전에서 활용 가능