본문 바로가기

Algorithm 문제 풀이/python

[python] 백준 11723번 집합

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

 

11723번: 집합

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

www.acmicpc.net

 

 

 

 

 

💻 코드

 

import sys

m = int(input())
s = set()

for _ in range(m):
    tmp = sys.stdin.readline().rstrip().split()

    # command만 있을 경우
    if len(tmp) == 1:
        if tmp[0] == 'all':
            s = set([i for i in range(1, 21)])
        else:
            s = set()

    # command와 x가 존재할 때
    else:
        command, x = tmp[0], tmp[1]
        x = int(x)

        if command == 'add':
            s.add(x)
        elif command == 'remove':
            s.discard(x)
        elif command == 'check':
            print(1 if x in s else 0)
        elif command == 'toggle':
            if x in s:
                s.discard(x)
            else:
                s.add(x)

 

 

📝 풀이

 

원래 비트마스크 문제이지만 집합 자료형 set을 이용하여 먼저 풀어보았다.

 

 

집합 자료형에 관해서는 아래의 자료를 참고하였다.

https://wikidocs.net/1015

 

02-6 집합 자료형

[TOC] ## 집합 자료형은 어떻게 만들까? 집합(set)은 파이썬 2.3부터 지원하기 시작한 자료형으로, 집합에 관련된 것을 쉽게 처리하기 위해 만든 자료형이다. ...

wikidocs.net

 

 

먼저 명령어와 숫자를 입력을 받는데 명령어만 입력 받는 경우(empty, all)와 명령어와 숫자를 입력 받는 경우(add, remove, check, toggle)로 나누었다. 그리고 각 명령어에 대해서는 집합 자료형 관련 함수를 사용하여 쉽게 해결할 수 있었다.

 

 

 

keyError 오류

이 문제에서 주의해야하는 것이 있었는데 집합 자료형 관련 함수인 remove를 쓰면 오류가 난다는 것이었다.

 

 

KeyError 오류로, remove 메소드는 지우려는 요소가 없을 때 이 에러가 발생한다. remove 메소드 대신 discard 메소드로 작성하면 해결할 수 있다.

 

 

 

또 메모리 초과....

 

왜 계속 메모리 초과가 나오는지 정말 의문이었다. 다른 분들의 코드도 참고하고 여러 질문들을 검색해보았는데도 해결이 되지 않았다. 한참을 찾아 이 질문 글을 보고 해결을 할 수 있었다...

 

 

https://www.acmicpc.net/board/view/49894

 

글 읽기 - [pypy3] 비트마스크를 사용했는데 메모리 초과 문제

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

이때까지 pypy3로 제출을 계속 해와서 그것으로 제출을 했었는데 그 답변 글에는 지금까지 pypy3으로 맞았습니다를 받은 사람이 한 명도 없고 현재 메모리 제한으로는 pypy3으로 맞았습니다를 받는 것이 불가능한 것으로 추정된다고 적혀있었다.

 

근데 현재를 기준으로 보면 pypy3으로 맞은 사람들이 많진 않지만 꽤 있었다. 그런데 거의 다 비트마스크로 문제를 풀어서 집합 자료형을 사용해서도 되는지는 확실하게 모르겠다. 다음에 비트마스크로 한 번 풀어봐야겠다.

 

 

다행히 그 다음에는 바로 python3으로 제출하여 맞았습니다를 받을 수 있었다.