728x90
반응형
https://www.acmicpc.net/problem/1700
1700번: 멀티탭 스케줄링
기숙사에서 살고 있는 준규는 한 개의 멀티탭을 이용하고 있다. 준규는 키보드, 헤어드라이기, 핸드폰 충전기, 디지털 카메라 충전기 등 여러 개의 전기용품을 사용하면서 어쩔 수 없이 각종 전
www.acmicpc.net
문제 해결
- 순서대로 멀티탭을 꽂고 빼고 해야한다.
- 뒤에 같은 종류가 있으면 안빼고 바로 연결하면 된다.
- 혹은 멀티탭에 비어있는 것이 있으면 꽂으면 된다.
- 만약 현재 연결해야 하는 것이 있고 멀티탭에 연결되어 있는 물건 중 같은 종류가 없으면 한 종류의 물건을 빼야한다.
- 빼야 하는 것은 뒤에 물건들을 보고 연결할 필요가 없거나 가장 늦게 연결할 필요가 있는 것을 제거하는 것이 낫다.
CODE
from collections import Counter
import sys
input = sys.stdin.readline
n, k = map(int, input().split())
M = list(map(int, input().split()))
V = set() # 멀티탭에 있는 것들 모음
memo = Counter(M) # 각 종류마다 몇 개가 있는지
ans =0
for i, x in enumerate(M):
memo[x] -= 1
if x in V: continue # 바로 연결하면 되서 뺄 필요x
if x not in V and len(V) >=n: #멀티탭에서 한 개를 빼야할 때
for a in V: # 멀티탭에 꽂혀 있는 것 하나씩 분석
if memo[a] ==0: # 더이상 쓸 일이 없으면 뽑자
V.remove(a)
ans += 1
break
else: # 다 써야한다면 가장 늦게 필요한 것을 뽑는 것이 낫다.
temp_set = set()
for j in range(i,k):
if M[j] in V:
temp_set.add(M[j])
if len(temp_set) ==n:
V.remove(M[j])
break
ans += 1
V.add(x)
print(ans)
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 5557 1학년 (1) | 2023.03.15 |
---|---|
[python] 백준 17626 Four Squares (0) | 2023.03.14 |
[python] 백준 1783 병든 나이트 (0) | 2023.03.14 |
[python] 백준 1343 폴리오미노 (0) | 2023.03.14 |
[python] 백준 2011 암호코드 (0) | 2023.03.14 |
댓글