본문 바로가기
Baekjoon Algorithm/python

[Python]BAEKJOON 11723번 집합

by SeolLab. 2023. 2. 27.
728x90

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

 

11723번: 집합

첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.

www.acmicpc.net

 

 

계속 75%에서 틀렸다.. 

        if a[0] =='all':S=set([i for i in range(1,21)])
에서 set([i for i in range(1,21)])라고 하지 않고 {[i for i in range(1,21)]}라고 했기 때문. 
set를 쓰지 않고 대괄호를 사용하면 unhashable type error가 발생한다. dictionary type에 list형이 잘못 들어갔다는 경고다. 
 
또 실수 했던 부분은 저 위 코드에서 if a[0] == 'all':이라 하지 않고 if a == 'all':이라고 했다. 
print(a)를 해보면, ['all']로 출력되므로 그냥 a라는 리스트를 갖다 넣으면 안되고 argument로 정확히 명시해야 한다. 
 
Sol1 
import sys
input = sys.stdin.readline
S = set()
for i in range(int(input())):
    a= input().split()
    if len(a) == 1:
        if a[0] =='all':S=set([i for i in range(1,21)])
        else: S=set()
    else:
        com, X = a[0], int(a[1])
        if com == 'add': S.add(X)
        elif com == 'remove':S.discard(X)
        elif com =='check':print(1 if X in S else 0)
        elif com == 'toggle':
            if X in S:S.discard(X)
            else: S.add(X)

1) 추가로, a= input().strip().split()와 같은 식으로 입력값의 뒷 공백을 제거하고 split()으로 작성한 사람들이 많던데, 구지 그렇게 하지 않아도 된다. split() 써서 다 잘라낸다.

 2) remove()함수와 discard()함수의 차이점을 분명히 알 필요가 있다. S.remove(X)함수는 집합 S에 argument X가 없으면 error를 발생시킨다. 그러나 discard()는 발생시키지 않는다. remove를 쓰려면 다음과 같이 코드를 작성할 수 있다. 

 

Sol2

import sys
input = sys.stdin.readline
S = set()
for i in range(int(input())):
    a= input().strip().split()
    if len(a) == 1:
        if a[0] =='all':S=set([i for i in range(1,21)])
        else: S=set()
    else:
        com, X = a[0], int(a[1])
        if com == 'add': S.add(X)
        elif com == 'remove':
            if X in S: 
                S.remove(X)
        elif com =='check':print(1 if X in S else 0)
        elif com == 'toggle':
            if X not in S:S.add(X)
            else:S.remove(X)

 

댓글