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

강준호·2023년 3월 18일
0

초고

import sys

class Set:
    def add(self,s,x):
        s.add(x)
        return s

    def remove(self,s,x):
        if x in s:
            s.remove(x)
        return s

    def check(self,s,x):
        if x in s:
            print(1)
        else:
            print(0)
        return s

    def toggle(self,s,x):
        if x in s:
            self.remove(s,x)
        else:
            s.add(x)
        return s

    def all(self,s):
        li =[]
        for i in range(1,21):
            li.append(i)
        s.update(li)
        return s

    def empty(self,s):
        s.clear()
        return s

m = int(sys.stdin.readline().strip())
s = set([])
blankSet = Set()
for i in range(m):
    line = list(map(str,sys.stdin.readline().strip().split()))
    act = line[0]
    if len(line)==2:
        x = int(line[1])
    if act == "add":
        blankSet.add(s,x)
    elif act == "remove":
        blankSet.remove(s,x)
    elif act == "check":
        blankSet.check(s,x)
    elif act == "toggle":
        blankSet.toggle(s,x)
    elif act == "all":
        blankSet.all(s)
    elif act == "empty":
        blankSet.empty(s)
  • set 클래스를 야심차게 만들어서 문제를 풀었는데 메모리초과ㅜ

개선된 코드

import sys

m = int(sys.stdin.readline().strip())
s = set([])
for i in range(m):
    line = list(map(str,sys.stdin.readline().strip().split()))
    act = line[0]
    if len(line)==2:
        x = int(line[1])
    if act == "add":
        s.add(x)
    elif act == "remove":
        s.discard(x)
    elif act == "check":
        print(1 if x in s else 0)
    elif act == "toggle":
        if x in s:
            s.discard(x)
        else:
            s.add(x)
    elif act == "all":
        s = set(range(1,21))
    elif act == "empty":
        s.clear()
  • Set 클래스를 제거하고 메인 코드에서 직접 실행 =>
    모든 작업에 대해 Set 클래스의 인스턴스를 생성할 필요가 없음으로 메모리 절약

  • remove() 메소드 대신 discard() 메소드를 사용
    remove()는 KeyError를 발생 but discard() 는 에러 발생 x

미세 팁

랜덤 입력을 받을때 empty 같이 한개인건 if 분기문을 사용해도 되지만

try except 를 사용하면 가독성과 효율이 좋다

 act = line[0]
    try:
        x = int(line[1])
    except IndexError:
        x = None

0개의 댓글