[알고리즘] 백준 11723 (파이썬 풀이)

    728x90

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

     

    11723번: 집합

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

    www.acmicpc.net

    문제

    비어있는 공집합 S가 주어졌을 때, 아래 연산을 수행하는 프로그램을 작성하시오.

    • add x: S에 x를 추가한다. (1 ≤ x ≤ 20) S에 x가 이미 있는 경우에는 연산을 무시한다.
    • remove x: S에서 x를 제거한다. (1 ≤ x ≤ 20) S에 x가 없는 경우에는 연산을 무시한다.
    • check x: S에 x가 있으면 1을, 없으면 0을 출력한다. (1 ≤ x ≤ 20)
    • toggle x: S에 x가 있으면 x를 제거하고, 없으면 x를 추가한다. (1 ≤ x ≤ 20)
    • all: S를 {1, 2, ..., 20} 으로 바꾼다.
    • empty: S를 공집합으로 바꾼다. 

    입력

    첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다.

    둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.

    출력

    check 연산이 주어질때마다, 결과를 출력한다.

     

    해결코드

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

     

    문제풀이

    일단 이 문제는 저번에 풀었던 큐,스택,덱과 비슷한 문제이다.

    다만 시간, 메모리 제한이 있기 때문에 일반적인 방법으로 풀면 오류가 날 것처럼 보인다.

    문제의 조건대로 풀면 되긴 하는데 set을 써야할 것 같다.

    해결 코드를 보면

    입력시간을 단축하기 위해 sys라이브러리의 readline을 사용한다.

    m에 수행할 명령어 개수를 입력받아주고

    li라는 set자료구조를 하나 만들어둔다.

    그리고 m개만큼 for문을 돌리는데, a라는 변수에 띄어쓰기 포함하여 명령어를 받아준다.

    만약 a의 길이가 1이고('all'이나 'empty'같은 명령어 - 뒤에 숫자 붙지 않음)

    a[0]이 'all'일 때 리스트를 1부터 20까지의 원소를 가진 리스트로 바꿔준다.(set사용)

    all이 아니라면 나머지는 empty이므로 empty일때는 set()을 써서 공백으로 초기화시켜준다.

    a[0]이 1이 아닐 때 (명령어 뒤에 숫자 붙는 경우)

    조건에 맞게 코드를 작성해주면 된다.

    다만 discard를 쓰는 이유는 remove를 쓰면 set리스트 안에 빼고 싶은 원소가 없을 때 오류가 나는데

    discard는 원소가 없어도 문제 없이 넘어가기 때문이다.

    728x90

    댓글