아이공의 AI 공부 도전기

[Baekjoon] 11723번 : 집합 (Python, 구현)

 

     

 

 

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

 

11723번: 집합

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

www.acmicpc.net

 

코드 링크

https://github.com/stellaluminary/Baekjoon

 

GitHub - stellaluminary/Baekjoon

Contribute to stellaluminary/Baekjoon development by creating an account on GitHub.

github.com

 

Python

 

시간 초과 - 방법 1 -  코드 길이 558B

 

원하는대로 구현. But 시간초과

 

s = []
for i in range(int(input())):
    a = list(input().split())
    if a[0] == 'add':
        if a[1] not in s:
            s.append(a[1])
    elif a[0] == 'remove':
        if a[1] in s:
            del s[s.index(a[1])]
    elif a[0] == 'check':
        if a[1] in s:
            print(1)
        else:
            print(0)
    elif a[0] == 'toggle':
        if a[1] in s:
            del s[s.index(a[1])]
        else:
            s.append(a[1])
    elif a[0] == 'all':
        s = [str(i) for i in range(1, 21)]
    elif a[0] == 'empty':
        s = []

 

시간 초과 - 방법 2 - 코드 길이 484B

 

set은 list에 비해 훨씬 빠르게 그 값을 넣고 빼는 것이 가능하다. 

또한, set에서 remove는 파일이 존재하지 않다면 error가 나는 삭제 명령어라면 discard는 에러가 발생하지 않는 삭제 명령어이다.

그럼에도 불구하고 시간 초과

 

import sys
s = set()

for i in range(int(input())):
    a = sys.stdin.readline().rstrip().split()
    if a[0] == 'add':
        s.add(a[1])
    elif a[0] == 'remove':
        s.discard(a[1])
    elif a[0] == 'check':
        print(1 if a[1] in s else 0)
    elif a[0] == 'toggle':
        if a[1] in s:
            s.discard(a[1])
        else:
            s.add(a[1])
    elif a[0] == 'all':
        s = set([str(i) for i in range(1, 21)])
    elif a[0] == 'empty':
        s = set()

 

 

방법 3 - 메모리 30840KB / 시간 5796ms / 코드 길이 528B

 

입력받은 a의 길이가 1일때와 그렇지 않을 때를 구분한다.

또한, func, v로 나눠 입력받아 넣어야만 시간 초과가 나지 않는다.

(방법 2와 같이 a[0]와 a[1]으로 입력받았다가 시간 초과날 수 있음)

 

import sys
s = set()

for i in range(int(input())):
    a = sys.stdin.readline().rstrip().split()
    if len(a) == 1:
        if a[0] == 'all':
            s = set([i for i in range(1, 21)])
        else:
            s = set()
        continue

    func, v = a[0], int(a[1])

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

 

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading