BAEKJOON /4673:셀프 넘버

hyihyi·2022년 1월 8일
1
post-thumbnail

[python] 자동으로 중복된 수를 제거해주는 set함수

-문제를 풀 때 사용한 python의 set함수 정리

1. 수학의 집합과 동일한 성질을 가짐

2. 중복된 값은 자동으로 제거됨

  • 이러한 특징 때문에 자료형의 중복을 제거하기 위한 필터 역할로 종종 사용
>>>s1={3,1,1,2,4,3,5]
>>>print(type(s1), s1)
<class 'set'> {1,2,3,4,5}
  • 인덱싱을 활용하려면 list나 tuple로 변환하여야 함
>>> s1 = set([1,2,3])
>>> l1 = list(s1)
>>> l1
[1, 2, 3]
>>> l1[0]
1
>>> t1 = tuple(s1)
>>> t1
(1, 2, 3)
>>> t1[0]
1
  • 순서가 없어 어떤 값이 먼저 나올지 알 수 없음
>>> for i in {1, 2, 4, 8, 16,32}:
>>> print(i)
32
1
2
4
8
16

3. add(메소드) : 원소 추가 가능

>>> k = {100, 105}
>>> k.add(50)
>>> k
{105, 50, 100}
>>> k.add(12)
>>> k
{105, 50, 100, 12}

4. update(메소드) : 여러 데이터를 한꺼번에 추가할 때 를 씀

  • set의 중복은 자동으로 제거되고 수정이라는 개념보다, 여러데이터를 한번에 추가할 때 사용
>>> k = {1, 2, 3}
>>> k.update([3, 4, 5])
>>> k
{1, 2, 3, 4, 5}

5. remove(item) : item에 해당하는 원소 삭제, 없으면 에러 발생

  • item에 해당하는 원소를 제거하고, 없으면 KeyError 발생
>>> k = {1, 2, 3}
>>> k.remove(3)
>>> k
{1, 2}
>>> k.remove(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 3

6. discard(item) : item에 해당하는 원소를 제거하고, 없어도 에러발생하지 않음

7. set(집합) 연산 - 연산자

  • | : 합집합 연산자
>>> a = {1, 2, 3, 4, 5}
>>> b = {3, 4, 5, 6, 7}
>>> c = a | b
>>> a
{1, 2, 3, 4, 5}
>>> b
{3, 4, 5, 6, 7}
>>> c
{1, 2, 3, 4, 5, 6, 7}
  • & : 교집합 연산자
>>> a = {1, 2, 3, 4, 5}
>>> b = {3, 4, 5, 6, 7}
>>> c = a & b
>>> a
{1, 2, 3, 4, 5}
>>> b
{3, 4, 5, 6, 7}
>>> c
{3, 4, 5}
  • - : 차집합 연산자
>>> a = {1, 2, 3, 4, 5}
>>> b = {3, 4, 5, 6, 7}
>>> c = a - b
>>> a
{1, 2, 3, 4, 5}
>>> b
{3, 4, 5, 6, 7}
>>> c
{1, 2}
  • ^ : 대칭차집합 연산자(합집합-교집합)
>>> a = {1, 2, 3, 4, 5}
>>> b = {3, 4, 5, 6, 7}
>>> c = a ^ b
>>> a
{1, 2, 3, 4, 5}
>>> b
{3, 4, 5, 6, 7}
>>> c
{1, 2, 6, 7}
  • |=, &=, -=, ^= : = 과 조합함으로써 연산과 동시에 할당
  • id는 변경되지 않음
>>> a = {1, 2, 3, 4, 5}
>>> b = {3, 4, 5, 6, 7}
>>> a |= b
>>> a
{1, 2, 3, 4, 5, 6, 7}
>>> b
{3, 4, 5, 6, 7}
>>> a = {1, 2, 3, 4, 5}
>>> b = {3, 4, 5, 6, 7}
>>> id(a)
4334668040
>>> a &= b
>>> a
{3, 4, 5}
>>> id(a)
4334668040

8. set(집합) - 연산메소드

  • union - 합집합
>>> a = {1, 2, 3, 4, 5}
>>> b = {3, 4, 5, 6, 7}
>>> c = a.union(b)
>>> a
{1, 2, 3, 4, 5}
>>> b
{3, 4, 5, 6, 7}
>>> c
{1, 2, 3, 4, 5, 6, 7}
  • intersection - 교집합
>>> a = {1, 2, 3, 4, 5}
>>> b = {3, 4, 5, 6, 7}
>>> c = a.intersection(b)
>>> a
{1, 2, 3, 4, 5}
>>> b
{3, 4, 5, 6, 7}
>>> c
{3, 4, 5}
  • difference - 차집합
>>> a = {1, 2, 3, 4, 5}
>>> b = {3, 4, 5, 6, 7}
>>> c = a.difference(b)
>>> a
{1, 2, 3, 4, 5}
>>> b
{3, 4, 5, 6, 7}
>>> c
{1, 2}
  • symmetric_difference : 대칭차집합 연산자(합집합-교집합)
>>> a = {1, 2, 3, 4, 5}
>>> b = {3, 4, 5, 6, 7}
>>> c = a.symmetric_difference(b)
>>> a
{1, 2, 3, 4, 5}
>>> b
{3, 4, 5, 6, 7}
>>> c
{1, 2, 6, 7}

9. set(집합) - 기타 메소드

  • issubset : 부분집합 여부 확인
>>> a = {1, 2, 3, 4, 5}
>>> b = {1, 2, 3}
>>> a.issubset(b)
False
>>> b.issubset(a)
True
  • issuperset : issubset과 반대 superset인지 확인
>>> a = {1, 2, 3, 4, 5}
>>> b = {1, 2, 3}
>>> a.issuperset(b)
True
>>> b.issuperset(a)
False
  • isdisjoint : 교집합이 없으면 True, 있으면 False
>>> a = {1, 2, 3}
>>> b = {4, 5, 6}
>>> a.isdisjoint(b)
True
>>> c = {1, 2, 3}
>>> d = {3, 4, 5}
>>> c.isdisjoint(d)
False

<문제 설명>

-어떠한 수 자체에 각각 자릿수의 숫자들을 더하는 함수가 있다.
ex)101+1+0+1=103
-이렇게 나온 숫자 103은 생성자 101이 있다고 말할 수 있다.
-10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하자.

<문제 풀이>

natural_num=set(range(1,10001)) #set함수로 natural_num에 1부터 10000까지 생성
generated_num=set()

for i in range(1,10001):
    for j in str(i): #str(i)=101
        i+=int(j) #i는 자기자신, 자기자신에다 문자열 각 자리수가 더해짐 ex)100+1+0+1
    generated_num.add(i) #생성자가 있는 숫자들이 모임

self_num=sorted(natural_num-generated_num) #전체에서 생성자가 있는 숫자들만 제거
for i in self_num:
    print(i)
profile
자유롭게 쓴 나의 자유로운 Development voyage⛵

0개의 댓글