알고리즘/백준

[백준 / 구현] 11723 : 집합 (python)

난감 2024. 6. 18. 10:39
728x90

난이도 : 실버 5

문제 설명

 

문제

비어있는 공집합 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 연산이 주어질때마다, 결과를 출력한다.

예제 입력 1

26
add 1
add 2
check 1
check 2
check 3
remove 2
check 1
check 2
toggle 3
check 1
check 2
check 3
check 4
all
check 10
check 20
toggle 10
remove 20
check 10
check 20
empty
check 1
toggle 1
check 1
toggle 1
check 1

예제 출력 1

1
1
0
1
0
1
0
1
0
1
1
0
0
0
1
0
 

풀이

import sys

M = int(sys.stdin.readline())
S = set()

for i in range(M):
    command = list(sys.stdin.readline().split())

    if len(command) == 2:
        num = int(command[1])

    if command[0] == 'add':
        S.add(num)
    elif command[0] == 'remove':
        S.discard(num) # discard() : 없으면 무시 / remove() : 없으면 오류 발생
    elif command[0] == 'check' :
        if num in S :
            print("1")
        else :
            print("0")
    elif command[0] == 'toggle':
        if num in S:
            S.remove(num)
        else:
            S.add(num)
    elif command[0] == 'all':
        S.clear()
        S = set(list(range(1, 21)))
    elif command[0] == "empty":
        S.clear()

 

input()으로 하니까 시간초과가 나서 대신 sys로 입력 받았다.

 

파이썬의 set 자료구조의 경우 찾기 연산이 O(1)이라서 배열 대신 set을 사용했다.

 

all과 empty 명령어의 경우 뒤에 숫자 없이 명령어 하나만 입력을 받고, 다른 명령어는 숫자를 포함해 명령어를 입력받는다. 그래서 command는 우선 list로 입력받고, 길이가 2인 경우 두번째 인덱스에 해당하는 값을 int형으로 변환하여 num 변수에 저장했다.

 

remove 명령어의 경우 제거해야할 대상이 없을 때는 무시해야하므로 set 연산 중 remove 대신 discard를 사용했다.

set.remove(num) 일 때, num이 없으면 오류를 발생시키고, set.discard(num)은 num이 없어도 오류가 발생하지 않는다.

 

all 명령어의 경우 {1, 2, ..., 20}을 저장해야한다. 따라서 list(range(1, 21))로 [1, 2, ..., 20] 인 리스트를 생성하고, 이를 set()함수로 감싸서 집합 형태로 저장했다.

 

python set 자료형 함수

선언

# 선언
S = set([1, 2, 3, 4, 5])
S = {1, 2, 3, 4, 5}

선언하는 방법은 set()으로 리스트를 감싸거나, {} 괄호로 선언하는 방법으로 2가지가 있다.

추가

# 추가
S.add(10) #{1, 2, 3, 4, 5, 10}

append 대신 add로 추가한다.

 

제거

# 제거
S.discard(15) # -> 오류 발생 X
S.remove(15)  # -> 오류 발생 O

S.discard(1) # {2, 3, 4, 5, 10}
S.remove(2)  # {3, 4, 5, 10}

S.clear()    # {}

discard와 remove 모두 집합 내 특정 데이터를 제거할 때 사용한다. 차이점은 remove는 없는 데이터를 제거하려고 하면 오류가 발생하지만 discard는 오류가 발생하지 않는다.

 

clear는 집합 내 전체 데이터를 제거한다.

 

 

 

반응형