728x90
https://www.acmicpc.net/problem/11723
11723번: 집합
첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.
www.acmicpc.net
# 조건
- add x : S에 x를 추가한다. S에 이미 x가 있는 경우 연산 무시
- remove x : S에서 x를 제거한다. S에 x가 없는 경우에는 연산 무시
- check x : S에 x가 있으면 1을, 없으면 0을 출력
- toggle x : S에 x가 있으면 x를 제거, 없으면 x를 추가
- all : S를 {1,2,3,...,20} 으로 바꾼다.
- empty : S를 공집합으로 바꾼다.
# 접근 방법 & Solution
- 조건의 함수들을 모두 정의하여 리스트로 풀이를 시도하였다.
- 메모리제한이 4MB에 시간이 1.5초 였고 수행연산의 MAX가 3,000,000이라 시간초과와 메모리초과가 발생하였다.
- 연산이 더 빠른 set형을 활용하여 풀어주었다.
- 들어온 문자열의 길이에 따라 all, empty를 구분지어주었고, 조건에 맞는 연산을 수행하도록 해주었다.
# 시간초과
import sys
sys.stdin = open('input.txt')
def add(x):
if not x in S:
S.append(x)
return S
def remove(x):
if x in S:
S.remove(x)
return S
def check(x):
if x in S:
return 1
else:
return 0
def toggle(x):
if x in S:
S.remove(x)
else:
S.append(x)
return S
def all():
S = [i for i in range(1, 21)]
return S
def empty():
S.clear()
return S
S = []
n = int(input())
for i in range(n):
func = input().split()
if func[0] == 'add':
add(int(func[1]))
elif func[0] == 'remove':
remove(int(func[1]))
elif func[0] == 'check':
print(check(int(func[1])))
elif func[0] == 'toggle':
toggle(int(func[1]))
elif func[0] == 'all':
S = all()
elif func[0] == 'empty':
empty()
# 통과 코드
import sys
m = int(sys.stdin.readline())
S = set()
for _ in range(m):
temp = sys.stdin.readline().strip().split()
if len(temp) == 1:
if temp[0] == "all":
S = set([i for i in range(1, 21)])
else:
S = set()
else:
func, x = temp[0], temp[1]
x = int(x)
if func == "add":
S.add(x)
elif func == "remove":
S.discard(x)
elif func == "check":
print(1 if x in S else 0)
elif func == "toggle":
if x in S:
S.discard(x)
else:
S.add(x)
728x90
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[백준 17276번] 파이썬 - 배열 돌리기 (0) | 2022.10.10 |
---|---|
[백준 18870번] 파이썬 - 좌표 압축 (1) | 2022.10.08 |
[백준 10989] 파이썬 - 수 정렬하기 3 (0) | 2022.09.17 |
[백준 2805] 파이썬 - 나무 자르기 (0) | 2022.09.17 |
[백준 10816] 파이썬 - 숫자 카드2 (0) | 2022.09.14 |