11723: 집합 - Python

beaver.zip·2024년 12월 14일
0

[알고리즘] 백준

목록 보기
38/45

문제

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

풀이 1 (오답)

s = set()

for _ in range(int(input())):
    cmd = input().split()

    if cmd[0] == "add":
        s.add(int(cmd[1]))
    elif cmd[0] == "remove":
        s.remove(int(cmd[1]))
    elif cmd[0] == "check":
        if int(cmd[1]) in s:
            print(1)
        else:
            print(0)
    elif cmd[0] == "toggle":
        if int(cmd[1]) in s:
            s.remove(int(cmd[1]))
        else:
            s.add(int(cmd[1]))
    elif cmd[0] == "all":
        s = set(list(range(1, 21)))
    else:
        s = set()
  • KeyError와 시간 초과가 발생한다.
  • KeyError: set.remove(element)에서, setelement가 존재하지 않으면 KeyError가 발생한다.
    -> element가 없어도 오류를 발생시키지 않는 .discard()를 사용해야 한다.
  • 시간 초과: input() 대신 sys.stdin.readline()을 사용해야 한다.

풀이 2

import sys
input = sys.stdin.readline

s = set()

for _ in range(int(input())):
    cmd = input().split()

    if cmd[0] == "add":
        s.add(int(cmd[1]))
    elif cmd[0] == "remove":
        s.discard(int(cmd[1]))
    elif cmd[0] == "check":
        if int(cmd[1]) in s:
            print(1)
        else:
            print(0)
    elif cmd[0] == "toggle":
        if int(cmd[1]) in s:
            s.discard(int(cmd[1]))
        else:
            s.add(int(cmd[1]))
    elif cmd[0] == "all":
        s = set(range(1, 21))
    else:
        s = set()
  • 풀이 1을 수정하였다.
    • input() -> sys.stdin.readline()
    • s = set(list(range(1, 21)) -> set(range(1, 21))
    • .remove() -> .discard()
  • 다른 분들의 풀이를 찾아보니, 명령어에 값이 포함되는지 if-else문으로 구분해서 풀기도 하셨다.

오늘의 교훈

  • 집합은 set로 구현할 수 있다.
# 1. 집합 생성
s = set()  # 빈 집합 생성
s = {1, 2, 3}  # 초기 요소를 가진 집합 생성
print("초기 집합:", s)  # 출력: 초기 집합: {1, 2, 3}

# 2. 요소 추가
s.add(4)  # 요소 4 추가
print("요소 추가 후:", s)  # 출력: 요소 추가 후: {1, 2, 3, 4}

# 3. 중복 요소 추가 시도
s.add(2)  # 이미 존재하는 요소 2 추가 시도
print("중복 요소 추가 후:", s)  # 출력: 중복 요소 추가 후: {1, 2, 3, 4}

# 4. 요소 제거
s.remove(3)  # 요소 3 제거
print("요소 제거 후:", s)  # 출력: 요소 제거 후: {1, 2, 4}

# 5. 존재하지 않는 요소 제거 시도
# s.remove(5)  # 요소 5가 없으면 KeyError 발생
s.discard(5)  # 요소 5가 없어도 에러 발생하지 않음
print("요소 제거 시도 후:", s)  # 출력: 요소 제거 시도 후: {1, 2, 4}

# 6. 요소 존재 확인
if 2 in s:
    print("2는 집합에 있습니다.")  # 출력: 2는 집합에 있습니다.
else:
    print("2는 집합에 없습니다.")

# 7. 집합 연산

# 다른 집합과의 합집합
s1 = {1, 2, 3}
s2 = {3, 4, 5}
union_set = s1.union(s2)
print("합집합:", union_set)  # 출력: 합집합: {1, 2, 3, 4, 5}

# 다른 집합과의 교집합
intersection_set = s1.intersection(s2)
print("교집합:", intersection_set)  # 출력: 교집합: {3}

# 다른 집합과의 차집합
difference_set = s1.difference(s2)
print("차집합 (s1 - s2):", difference_set)  # 출력: 차집합 (s1 - s2): {1, 2}

# 대칭 차집합 (합집합에서 교집합을 뺀 집합)
symmetric_difference_set = s1.symmetric_difference(s2)
print("대칭 차집합:", symmetric_difference_set)  # 출력: 대칭 차집합: {1, 2, 4, 5}

# 8. 집합 반복문
print("집합의 요소들:")
for element in s:
    print(element)
# 출력:
# 집합의 요소들:
# 1
# 2
# 4

# 9. 집합 길이 확인
print("집합의 크기:", len(s))  # 출력: 집합의 크기: 3

# 10. 집합 초기화 예제
all_set = set(range(1, 21))  # 1부터 20까지의 숫자를 가진 집합
print("1부터 20까지의 집합:", all_set)
# 출력: 1부터 20까지의 집합: {1, 2, 3, ..., 20}

# 11. 집합 클리어 (모든 요소 제거)
s.clear()
print("집합 클리어 후:", s)  # 출력: 집합 클리어 후: set()
  • set.remove(element) vs set.discard(element)
    • .remove(): set에 element가 존재하지 않으면 KeyError 발생
    • .discard(): set에 element가 존재하지 않아도 에러 발생 X

참고 자료

profile
NLP 일짱이 되겠다.

0개의 댓글