세트(set)

set은 집합 자료형이라고 부르고 있습니다. 하지만 집합을 다루는 문제는 거의 없어서 보통 중복된 값을 제거하는 기능으로 사용하고 있습니다.

선언 방법은 list의 list()와 대괄호 [ ], tuple의 tuple()과 소괄호 ( )와 같이 두 가지 방법이 있는데요. 하지만 리스트, 튜플과 다르게 set은 초기 환경에 따라 선언 방법이 달라집니다.

t = set()
t = {1, 2, 3, 1, 2, 3}

print(t)
# {1, 2, 3}

t = set("hello")
print(t)
# {'h','e','l','o'}

set은 위와 같이 set()을 사용하거나 중괄호({, })를 사용합니다. set()에서 괄호 안에는 숫자를 넣을 수 없습니다.

그리고 t = { }로만 선언하면 바로 다음에서 배우는 딕셔너리로 만들어지기 때문에 처음에 세팅하는 방법에 따라 선언 방법이 달라지는데요. 처음에 어떠한 값도 들어있지 않으면 set()을 사용해야 하고, 처음에 값들이 들어가야 있어야 하면 { 숫자 } 로 적어서 set을 만들어주면 됩니다.

초기 환경

선언 방법

입력 값을 받기 전에 들어가는 값이 있다.

t = { 숫자들 }

입력 값을 받기 전에 들어가는 값이 없다.

t = set()

이렇게 상황에 따라 선언을 해주시면 됩니다.

set은 집합 자료형이기 때문에 집합에 관한 연산을 지원해주고 있습니다.

먼저 값을 집어 넣어주는 방법은 add라는 메소드를 사용합니다. 참고로 집합 안에 이미 있는 값을 추가해주면 아무런 변화가 없게 됩니다.

A = {1,2,3}
B = {3,4,5}

A.add(4) # A = {1, 2, 3, 4}
B.add(6) # B = {3, 4, 5, 6}

A.add(1) # A = {1, 2, 3, 4}
B.add(6) # B = {3, 4, 5, 6}

한 줄로 여러 개를 입력 받을 때에는 리스트를 입력 받을 때와 똑같이 작성하시면 됩니다.

S = set(map(int,input().split()))
S = set(input().split())

그리고 set은 여러분이 고등학교에서 배운 내용인 합집합, 교집합, 차집합과 추가로 대칭 차집합 이라는 연산을 제공해주고 있습니다.

대칭 차집합이라는 이름은 학교에서 안 배웠던 것으로 기억하는데, 아래 그림처럼 (A와 B의 합집합) - (A와 B의 교집합)입니다.

합집합, 교집합, 차집합, 대칭차집합에 대응하는 연산 기호는 각각 |, &, -, ^ 입니다.

A = {1,2,3,4}
B = {3,4,5,6}

#합집합
C = A | B
C = A.union(B)
print('합집합:',C)

#교집합
C = A & B
C = A.intersection(B)
print('교집합:',C)

#차집합
C = A - B
C = A.difference(B)
print('차집합:',C)

#대칭차집합(합집합 - 교집합)
C = A ^ B
C = A.symmetric_difference(B)
print('대칭차집합:',C)

이외에도 update, remove, issubset 등등 다양한 메소드들이 있습니다. 하지만 이 집합을 가지고 풀 수 있는 문제는 찾기 힘들어서 add 말고는 지금 잠깐 기억해두었다가 나중에 까먹어도 상관없는 내용이긴 합니다. 대부분 set을 이용하는 문제는 중복 제거 기능을 이용하는 문제들입니다.

그리고 set은 순서가 없기 때문에 인덱싱을 지원해주지 않습니다. 그래서 A[0], A[1], A[len(A)-1] 이렇게 하나를 선택해서 사용할 수가 없어요.

이제 문제를 풀어봅시다.

N명의 듣도 못한 사람과 M명의 보도 못한 사람이 주어질 때, 듣도 보도 못 한 사람을 출력하라는 문제입니다.

듣도 보도 못한 사람이면 N명이 있는 집합에 포함되고, M명이 있는 집합에 포함되어 있어야 하므로 교집합을 구해서 출력하면 됩니다.

출력할 때 주의할 점은 사전 순으로 출력을 해야 하는데, set은 정렬을 해주는 함수인 sorted를 지원하지 않습니다. 그래서 list로 변환하여 sorted함수를 이용한 후에 출력을 해주시면 됩니다.

n, m = map(int,input().split())
A, B = set(),set()
for i in range(n):
    s = input()
    A.add(s)
for i in range(m):
    s = input()
    B.add(s)
C = sorted(list(A & B))
print(len(C))
for i in range(len(C)):
    print(C[i])

또 다른 문제를 풀어봅시다.

42로 나눈 나머지를 구해서 서로 다른 값이 몇 개가 나오는지 출력하는 문제입니다.

set에서 중복 제거 기능이 있기 때문에 이것을 이용해봅시다.

문제는 for문을 사용해서 10개의 값을 입력받고 add를 이용하여 값을 추가해 나가면 되겠네요. 그리고 마지막에 출력할 때는 len()을 이용하면 됩니다.

a = set()
for i in range(10):
    x = int(input())
    a.add(x % 42)
print(len(a))

풀어 볼 문제

Last updated