코딩라이브러리/파이썬

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

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

set() 함수 사용

  • 중복제거를 하고 싶을 때, set() 함수를 사용한다.
  • set(i) 함수는 집합으로 만들어주는 함수이며 i의 값은 iterable 형식을 집합 객체로 반환해 준다.
  • 이때 iterable 형식은 딕셔너리의 키나 집합의 멤버로 사용할 수 있는 객체여야 한다.
#list 를 set() 로 변환하면 집합으로 반환하면서 중복제거한다.
a = [2,1,3,4,5,5,6,7,3]
print(a) # [2, 1, 3, 4, 5, 5, 6, 7, 3]
print(len(a)) # 9
print(set(a)) # {1, 2, 3, 4, 5, 6, 7}
print(len(set(a))) # 7


b = ['lee', 'yun', 'park', 'yun', 'bang', 'lee']
print(b) # ['lee', 'yun', 'park', 'yun', 'bang', 'lee']
print(len(b)) # 6
print(set(b)) # {'bang', 'yun', 'lee', 'park'}
print(len(set(b))) # 4
  • set() 함수 사용하여 중복제거한 다음에는 다시 리스트로 형변환하여 사용한다.
#set 함수로 변환하여 중복제거한 후 다시 list 로 형변환하여 사용
#다시 list 형변환
chga = list(set(a))
print(chga) # [1, 2, 3, 4, 5, 6, 7]
chgb = list(set(b))
print(chgb) # ['yun', 'park', 'lee', 'bang']
  • set 함수 기타 연산 메서드
a = ['lee', 'yun', 'park']
b = ['yun', 'bang', 'lee']
#교집합
c = set(a).intersection(b)
print(c) # {'yun', 'lee'}
#합집합
d = set(a).union(b)
print(d) # {'lee', 'bang', 'yun', 'park'}
#차집합
e = set(a).difference(b)
f = set(b).difference(a)
print(e) # {'park'}
print(f) # {'bang'}

 

set(), frozenset() 함수 차이점

  • set() 함수와 frozenset() 함수는 동일한 기능을 가지고 있으나 값을 추가할 수 있는지 없는지가 주요 차이점이다.
  • set() 은 가변함수, frozenset() 은 불변함수
ad = set(a)
ad.add('bang') # 요소 추가
print(ad) # {'lee', 'yun', 'park', 'bang'}
fd = frozenset(b)
fd.add('bang') # AttributeError: 'frozenset' object has no attribute 'add'

 

▶ set 연습 백준 문제풀이

https://www.acmicpc.net/problem/2776

"""
입력
첫째 줄에 테스트케이스의 개수 T가 들어온다.
다음 줄에는 ‘수첩 1’에 적어 놓은 정수의 개수 N(1 ≤ N ≤ 1,000,000)이 입력으로 들어온다.
그 다음 줄에  ‘수첩 1’에 적혀 있는 정수들이 N개 들어온다.
그 다음 줄에는 ‘수첩 2’에 적어 놓은 정수의 개수 M(1 ≤ M ≤ 1,000,000) 이 주어지고,
다음 줄에 ‘수첩 2’에 적어 놓은 정수들이 입력으로 M개 들어온다. 
모든 정수들의 범위는 int 로 한다.

출력
‘수첩2’에 적혀있는 M개의 숫자 순서대로, ‘수첩1’에 있으면 1을, 없으면 0을 출력한다.
"""
import sys
#입력값 받기
T = int(sys.stdin.readline().rstrip())
#문제풀이 Set() 사용
for i in range(0, T):
    cnt1 = int(sys.stdin.readline().rstrip())
    memo1 = set(map(int,sys.stdin.readline().rsplit()))
    cnt2 = int(sys.stdin.readline().rstrip())
    memo2 = list(map(int,sys.stdin.readline().rsplit()))
          
    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
"""

 

☞ 파이썬 자습서 참고 사이트

 

Built-in Types

The following sections describe the standard types that are built into the interpreter. The principal built-in types are numerics, sequences, mappings, classes, instances and exceptions. Some colle...

docs.python.org