백준 : [Silver V] 집합 - 11723

GitHub Link

문제 설명

풀이 코드

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import sys


def add(x):
    if x not in _set:
        _set.add(x)


def remove(x):
    if x in _set:
        _set.remove(x)


def check(x):
    if x in _set:
        print(1)
    else:
        print(0)


def toggle(x):
    if x in _set:
        remove(x)
    else:
        add(x)


def _all():
    return set([i for i in range(1, 21)])


def empty():
    return set()


_set = set()

m = int(sys.stdin.readline())

commands = {
    "add": add,
    "remove": remove,
    "check": check,
    "toggle": toggle,
    "all": _all,
    "empty": empty,
}

for _ in range(m):
    command = sys.stdin.readline().split()
    if command[0] in ["all", "empty"]:
        _set = commands[command[0]]()
        # print(_set)
    else:
        commands[command[0]](int(command[1]))

CHECK!

  • 전역 변수 관련 헷갈리는 부분이 있어서 chat gpt한테 물어봐서 해결했다. 좀 더 나은 방식으로 코드를 고쳐봐야겠다.

  • chat gpt 답변

    이 코드에서 함수들이 전역 변수 _set를 직접 조작하는 것은 파이썬에서 허용되는 행위입니다. 전역 변수는 함수 내부에서 읽기 및 수정이 가능합니다. 그러나 전역 변수에 새로운 객체를 할당하려면 주의가 필요합니다. 이 코드에서 _set = set()와 같은 대입은 실제로 전역 변수 _set을 수정하는 것이 아니라, 지역 변수 _set을 새롭게 생성합니다.

    파이썬에서 함수 내부에서 전역 변수에 새로운 값을 할당하려면, global 키워드를 사용해야 합니다. 이것은 해당 함수 내에서 해당 변수가 전역 변수임을 파이썬 인터프리터에게 알리는 것입니다.

    예를 들어, _all 함수에서 전역 변수 _set에 새로운 집합을 할당하려면 다음과 같이 작성해야 합니다:

    1
    2
    3
    4
    
    Copy code
    def _all():
        global _set
        _set = set([i for i in range(1, 21)])
    

    이렇게 하면 _set은 전역 변수로 취급되며, 함수 내에서 새로운 값으로 재할당됩니다. global 키워드 없이 _set = set()를 사용하면, 해당 함수의 지역 범위에서 새로운 _set 변수가 생성되고, 전역 변수 _set는 변경되지 않습니다.

Hugo로 만듦
JimmyStack 테마 사용 중