세트 = {값1, 값2, 값3}
파이썬은 집합을 표현하는 세트(set)라는 자료형을 제공한다. 수학에서 배우는 그 집합이다. 세트는 합집합, 교집합, 차집합 등의 연산이 가능하다.
>>> fruits = {'strawberry', 'grape', 'orange', 'pineapple', 'cherry'}
>>> fruits
{'pineapple', 'orange', 'grape', 'strawberry', 'cherry'}
세트는 중복되는 값이 있더라도 하나만 보여주며 출력할 때마다 요소 순서가 랜덤이다. 리스트 튜플, 딕셔너리와 달리 [ ]로 특정 요소만 출력할 수 없다.
in, not in 연산자를 사용한다.
set(반복가능한객체)
>>> a = set('apple') # 유일한 문자만 세트로 만듦
>>> a
{'e', 'l', 'a', 'p'}
>>> b = set(range(5))
>>> b
{0, 1, 2, 3, 4}
>>> c = set() # set출력시 요소는 {}되지만 생성은 ()다! {}로 하면 딕셔너리가 만들어짐
>>> c
set()
내용을 변경할 수 없는 세트다.
세트는 리스트나 딕셔너리와 달리 세트 안에 세트를 넣을 수 없다.
frozenset는 세트 안에 세트를 넣고 싶을 때 사용한다. frozenset는 frozenset를 중첩해서 넣을 수 있다. 단, frozenset만 넣을 수 있고, 일반 set는 넣을 수 없다.
>>> frozenset({frozenset({1, 2}), frozenset({3, 4})})
frozenset({frozenset({1, 2}), frozenset({3, 4})})
세트 자료형에 |, &, -, ^ 연산자와 할당 연산자 =을 함께 사용하면 집합 연산의 결과를 변수에 다시 저장(할당)한다.
|=은 현재 세트에 다른 세트를 더하며 update 메서드와 같다.
세트1 |= 세트2
세트1.update(세트2)
>>> a = {1, 2, 3, 4}
>>> a |= {5}
>>> a
{1, 2, 3, 4, 5}
>>> a = {1, 2, 3, 4}
>>> a.update({5})
>>> a
{1, 2, 3, 4, 5}
&=은 현재 세트와 다른 세트 중에서 겹치는 요소만 현재 세트에 저장하며 intersection_update 메서드와 같다.
>>> a = {1, 2, 3, 4}
>>> a &= {0, 1, 2, 3, 4}
>>> a
{1, 2, 3, 4}
>>> a = {1, 2, 3, 4}
>>> a.intersection_update({0, 1, 2, 3, 4})
>>> a
{1, 2, 3, 4}
-=은 현재 세트에서 다른 세트를 빼며 difference_update 메서드와 같다.
>>> a = {1, 2, 3, 4}
>>> a -= {3}
>>> a
{1, 2, 4}
>>> a = {1, 2, 3, 4}
>>> a.difference_update({3})
>>> a
{1, 2, 4}
^=은 현재 세트와 다른 세트 중에서 겹치지 않는 요소만 현재 세트에 저장하며 symmetric_difference_update 메서드와 같다.
>>> a = {1, 2, 3, 4}
>>> a ^= {3, 4, 5, 6}
>>> a
{1, 2, 5, 6}
>>> a = {1, 2, 3, 4}
>>> a.symmetric_difference_update({3, 4, 5, 6})
>>> a
{1, 2, 5, 6}
세트는 부분집합, 진부분집합, 상위집합, 진상위집합과 같이 속하는 관계를 표현할 수도 있다. 이를 확인할 때 세트 자료형에 부등호와 등호 사용한다.
>>> a = {1, 2, 3, 4}
>>> a <= {1, 2, 3, 4}
True
>>> a.issubset({1, 2, 3, 4, 5})
True
>>> a = {1, 2, 3, 4}
>>> a < {1, 2, 3, 4, 5}
True
3.>=은 현재 세트가 다른 세트의 상위집합(superset)인지 확인하며 issuperset 메서드와 같다.
현재세트 >= 다른세트
현재세트.issuperset(다른세트)
4.>은 현재 세트가 다른 세트의 진상위집합(proper superset)인지 확인하며 메서드는 없다.
==. != 연산자를 사용한다.
disjoint를 사용한다.
현재세트.isdisjoint(다른세트)
>>> a = {1, 2, 3, 4}
>>> a.isdisjoint({5, 6, 7, 8}) # 겹치는 요소가 없음
True
>>> a.isdisjoint({3, 4, 5, 6}) # a와 3, 4가 겹침
False
add(요소)
remove(요소), discard(요소)
discard()는 해당 요소가 없을 경우 에러 없이 그냥 넘어간다.
.pop()
만약 요소가 없을 경우(세트가 비었을 때) 에러를 발생시킨다.
.clear()
len(세트)
할당하면 같은 객체를 참조한다.
.copy() 하면 완전히 복사되어 한쪽을 변경해도 나머지에 반영되지 않는다.
for문으로 돌리면 된다. 세트의 요소는 자리가 랜덤으로 출력되기 때문에 출력할 때마다 순서가 바뀐다.
바로 세트를 만들어 for문에 사용해도 된다.
for i in {1, 2, 3, 4}:
print(i)
{식 for 변수 in 반복가능한객체}
set(식 for 변수 in 반복가능한객체)
>>> a = {i for i in 'apple'}
>>> a
{'l', 'p', 'e', 'a'} #세트는 문자열 순서 랜덤
>>> a = {i for i in 'pineapple' if i not in 'apl'}
>>> a
{'e', 'i', 'n'} #조건문에 지정된 문자가 빠지고 중복값은 하나만 존재
n,m=map(int,input().split())
a={i for i in range(1,m+1) if n % i == 0}
b={i for i in range(1,m+1) if m % i == 0}
divisor = a & b
result = 0
if type(divisor) == set:
result = sum(divisor)
print(result)