티스토리 뷰

필자가 고등학생이던 시절, 누구나 한 권씩 가지고 있는 유명한 수학 책이 있었는데 첫 단원이 '집합'이었습니다. 중학교 겨울방학때 미리 예습을 한답시고 공부를 하였는데 그 누가 그랬던가요. 작심삼일이라고... 두 주먹 불끈 쥐고 으쌰으쌰 도전했는데, 딱 집합까지였습니다. 스스로 다음 단원으로 진도를 나가는 게 참 쉽지가 않더군요. 

(후에 학교를 와 보니 다른 친구들도 모두 집합 부분만 새카맣게 연필 자국이...)

 

이번에 배워볼 자료구조는 세트(set, 집합)입니다. 세트는 중복을 허용하지 않으며 또한 데이터의 순서도 보장하지 않습니다. 수학에서 배우는 것과 동일하게 중괄호를 이용하여 선언할 수 있습니다.

{value1, value2, ...}

중복을 허용하지 않으므로 같은 값은 여러 번 적어도 딱 한 번만 들어가게 됩니다.

my_set = {1, 2, 3, 3, 3} # 중복을 허용하지 않으므로 3은 1번만 들어감
print(my_set) # {1, 2, 3}

정수, 문자열 등 다양한 형태의 값을 선언할 수 있으며, 중괄호 대신 set() 를 이용하는 방법도 있습니다. 어떤 회사의 개발팀 내에 자바와 파이썬을 할 줄 아는 사람들의 집합을 각각 정의해보겠습니다.

java = {"유재석", "김태호", "양세형"} # 자바 개발자 집합
python = set(["유재석", "박명수"]) # 파이썬 개발자 집합

집합의 성질을 이용하여 두 집합 중 공통되는 값들만 뽑아내는 교집합은 & 기호나 intersection() 을 이용하면 됩니다. 교집합을 이용하여 자바와 파이썬을 모두 다룰 줄 아는 개발자를 확인해볼까요?

# 교집합 (java 와 python 을 모두 할 수 있는 개발자)
print(java & python) # {'유재석'}
print(java.intersection(python)) # {'유재석'}

두 집합을 합치는 합집합은 키보드의 백스페이스 근처에 있는 | 기호나 union() 을 이용하면 됩니다. 자바 또는 파이썬 중 하나라도 다룰 줄 아는 개발자를 출력해보겠습니다. 이 때 두 집합에 공통으로 있는 값(예제에서는 유재석씨) 은 중복을 허용하지 않으므로 1번만 출력됩니다.

# 합집합 (java 또는 python 을 할 수 있는 개발자)
print(java | python) # {'박명수', '유재석', '김태호', '양세형'}
print(java.union(python)) # {'박명수', '유재석', '김태호', '양세형'}
잠깐!
집합은 순서를 보장하지 않으므로 집합 내 데이터들의 출력 순서는 다음과 같이 실행할 때마다 달라질 수 있어요.

(예)
{'박명수', '유재석', '김태호', '양세형'}
{'양세형', '박명수', '유재석', '김태호'}
...

새로운 프로젝트를 대비하여 개발팀 인력들을 대상으로 파이썬 교육이 필요하다고 합니다. 파이썬을 이미 할 줄 아는 분들은 또 배울 필요는 없을테니, 자바만 할 줄 아는 인력들만 확인해보겠습니다. 이 때는 차집합을 이용할 수 있는데, 파이썬에서는 - 기호 또는 difference() 를 이용하면 됩니다.

# 차집합 (java 는 할 수 있지만 python 은 할 줄 모르는 개발자)
print(java - python) # {'양세형', '김태호'}
print(java.difference(python)) # {'양세형', '김태호'}

파이썬 교육을 마친 후에 시험을 봤는데 아쉽게도 양세형씨는 탈락하고 김태호씨는 합격을 했다고 가정하겠습니다. 그러면 김태호씨는 파이썬 개발 프로젝트에 참여를 할 수 있기 때문에 다음과 같이 add() 를 이용하여 파이썬 개발자 집합에 추가를 해주겠습니다.

# python 개발자 추가 (기존 개발자 : 박명수, 유재석)
python.add("김태호")
print(python) # {'박명수', '유재석', '김태호'}

저런, 김태호씨가 파이썬 공부를 너무 열심히 한 탓인지 원래 할 줄 알던 자바를 잊었다고 합니다. 아쉽지만 remove() 를 이용하여 자바 개발자 집합에서 제외를 해야겠네요.

# java 개발자 삭제 (기존 개발자 : 유재석, 김태호, 양세형)
java.remove("김태호")
print(java) # {'유재석', '양세형'}

집합의 성질만 잘 이해하고 있다면 크게 어렵지 않게 자료구조를 활용할 수 있습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함