https://www.acmicpc.net/problem/1700
문제
N구 멀티탭으로 K번의 전자제품 사용을 주어진 순서에 맞게 행동해야한다. 멀티탭에 꽂힌 전자제품을 뽑는 최소 횟수를 구하라
입력
첫번째 줄 => N: N구의 멀티탭 K: K번의 행위
두번째 줄 => K번의 행위들이 일렬로 출력
풀이
일단 전자제품을 모두 꽂는게 우선이다. 멀티탭이 비어있다면 주어진 순서에 따라 전자제품을 멀티탭에 꽂는다.
만일 꽂으려는 전자제품이 이미 멀티탭에 꽂혀있다면 전자제품을 사용한것이기에 다음 순서로 넘어간다.
멀티탭에 이미 빈 공간이 없고 꽂혀있지않은 전자제품을 사용해야한다면 멀티탭에서 앞으로 사용하지않거나 가장 나중에 사용하는 전자제품을 골라서 자리를 바꾸어준다. 멀티탭에서 전자제품 간의 자리를 바꿨기에 횟수에 1을 더해준다.
# 1700 멀티탭 스케줄링
import sys
input = sys.stdin.readline
N, K = map(int, input().split())
arr = list(map(int, input().split()))
multitab = [0] * N
plug_out = 0
for i in range(K):
# 멀티탭에 이미 존재하는 가전제품이라면
if arr[i] in multitab:
continue
# 멀티탭에 빈 곳이 있다면
elif 0 in multitab:
multitab[multitab.index(0)] = arr[i]
continue
# 멀티탭에 꽉찼고 멀티탭에 없는 가전제품을 써야한다면
# 앞으로 안쓰이는 가전제품 혹은 앞으로 가장 나중에 사용하는 가전제품을 찾아서 뽑는다.
else:
left_arr = arr[i:]
maximum = 0
for j in multitab:
# 만일 앞으로 사용하지 않는다면
if j not in left_arr:
change = j
break
# 가장 나중에 사용하는것을 찾아준다.
else:
if left_arr(j) > maximum:
maximum = left_arr.index(j)
change = j
# 바꿀 가전제품 j를 찾아준 뒤에 다음 가전제품을 대신 넣어준다.
multitab[multitab.index(change)] = arr[i]
plug_out += 1
print(plug_out)
출력값
'백준 > 그리디' 카테고리의 다른 글
[백준] 13458번 시험감독 - 파이썬 (0) | 2022.02.11 |
---|---|
[백준] 2869번 최대공약수와 최소공배수 - 파이썬 (0) | 2022.02.05 |
[백준] 1080번 행렬 - 파이썬 (0) | 2022.02.04 |
[백준] 1969번 DNA - 파이썬 (0) | 2022.02.03 |
[백준] 1946번 신입 사원 - 파이썬 (0) | 2022.02.02 |