[python 파이썬] 백준 11723번 집합

2021. 3. 2. 00:03Algorithm/BOJ

반응형
 

11723번: 집합

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

www.acmicpc.net

이 문제는 비트마스크를 이용한 문제라고 하는데 어디에 어떻게 적용해야할지 감이 안잡혀서 생각나는대로 풀어봤다. 

비트마스크 문제들도 여러개 접해보자. 

 

풀이1 - 시간초과

이렇게 푸니까 시간초과가 나왔다 

m = int(input())

S=set() #집합자료형
for _ in range(m):
    tmp = input().split()

    if len(tmp)==1:
        if tmp[0]=='all':
            s=set([i for i in range(1,21)])
        else:
            s=set()
        continue
    a,b=tmp[0],int(tmp[1])

    if a=='add':
        S.add(b)

    if a=='remove':
        S.discard(b)

    if a=='toggle' and b in S:
        S.discard(b)
    elif a=='toggle' and b not in S:
        S.add(b)

    if a=='check' and b in S:
        print(1)
    elif a=='check' and b not in S:
        print(0)

 

풀이2 - 정답

mong9data.tistory.com/91 이 블로그 참고해서 푼 것인데 

나와 차이점은 정규표현식, sys 사용이다.

시간초과가 나올때 최대한 시간을 줄일 수 있는 방법을 찾으며 풀자  

import sys
 
s = set()
n = int(input())
 
for i in range(n):
    tmp = sys.stdin.readline().strip().split()
 
    if len(tmp) == 1: # command만 있을 경우
        if tmp[0] == 'all':
            s = set([i for i in range(1, 21)])
        else:
            s = set()
        continue
 
    # command와 target이 존재할 때
    command, target = tmp[0], tmp[1]
    target = int(target)
 
    if command == 'add':
        s.add(target)
    elif command == 'check':
        print(1 if target in s else 0)
    elif command == 'remove':
        s.discard(target)
    elif command == 'toggle':
        if target in s:
            s.discard(target)
        else:
            s.add(target)
반응형