백준 & 프로그래머스
백준.멀티탭 스캐줄링.1700.py
concho
2023. 9. 20. 16:23
https://www.acmicpc.net/problem/1700
1700번: 멀티탭 스케줄링
기숙사에서 살고 있는 준규는 한 개의 멀티탭을 이용하고 있다. 준규는 키보드, 헤어드라이기, 핸드폰 충전기, 디지털 카메라 충전기 등 여러 개의 전기용품을 사용하면서 어쩔 수 없이 각종 전
www.acmicpc.net
완전탐색으로 풀다가 => 시간초과 +메모리초과 => 그래도 나와있는 테케중엔 틀린거x
그리디로 다시 도전
성공
그리디 코드
# 교훈: 멀티탭을 사자
import sys
def solution(start_set, procedures,n):
case_set, pro_dic, case_cnt = start_set, dict(),0
for idx, pr in enumerate(procedures):
if pr in pro_dic:
pro_dic[pr].append(idx)
else:
pro_dic[pr] = [idx]
for pr in procedures:
if pr in case_set:
del pro_dic[pr][0]
else:
case_cnt += 1
del pro_dic[pr][0]
# case_set 중에 안나오는거 제거, 만약 다 나오면
# case_set 중에 가장 나중에 나오는 제품을 제거
later_idx, later_prod = [], False
for product in case_set:
if len(pro_dic.get(product,[])) == 0:
later_prod = product
break
else:
later_idx.append(min(pro_dic[product]))
if later_prod:
case_set.remove(later_prod)
else:
case_set.remove(procedures[max(later_idx)])
case_set.add(pr)
return case_cnt
if __name__ == '__main__':
n, k = map(int, sys.stdin.readline().rstrip().split())
use_procedure = list(map(int, sys.stdin.readline().rstrip().split()))
start_pro = set()
cnt = 0
while True:
cnt += 1
start_pro.add(use_procedure[0])
del use_procedure[0]
if len(start_pro) == n or len(use_procedure) == 0: break
if k-cnt+n <= n:
print(0)
else:
min_cnt = solution(start_pro,use_procedure,n)
print(min_cnt)
완전탐색 코드
# 교훈: 멀티탭을 사자
import sys
def solution(start_set, procedures,n):
case_set_list, case_cnt = [start_set], [0]
min_cnt = 200
for pr in procedures:
new_case_set_list = []
new_case_cnt = []
for i, case_set in enumerate(case_set_list):
if pr in case_set:
new_case_set_list.append(case_set)
new_case_cnt.append(case_cnt[i])
else:
for num in case_set:
if min_cnt+n > case_cnt[i]+1:
new_case_set_list.append({pr} | case_set - {num})
new_case_cnt.append(case_cnt[i]+1)
min_cnt = min(new_case_cnt)
case_set_list = new_case_set_list
case_cnt = new_case_cnt
return min(case_cnt)
if __name__ == '__main__':
n, k = map(int, sys.stdin.readline().rstrip().split())
use_procedure = list(map(int, sys.stdin.readline().rstrip().split()))
if k <= n:
print(0)
else:
min_cnt = solution(set(use_procedure[0:n]),use_procedure[n:k],n)
print(min_cnt)