매 순간 최선의 선택으로 결과를 도출한다.
이 문제에서는 새로운 전자기기를 꽂을 때, 기존에 꽂혀있는 어떤 전자기기를 빼는가 가 가장 중요하다.
import sys
if __name__ == '__main__':
N, K = map(int,sys.stdin.readline().split(' '))
linput = list(map(int,sys.stdin.readline().split(' ')))
count = 0
mt = set()
tmp = 0
while len(mt) < N and len(linput) > tmp:
mt.add(linput[tmp])
tmp = tmp + 1
# 처음은 멀티탭이 비어있으니, 일단 꽂음.
# 중복된 건 꽂을 필요 없으니 중복 제거하여 꽂음
for i in range(tmp,len(linput)):
hubo1 = linput[i+1:]
# 다음에 꽂을 전자기기 중복 제거, 순서 유지
hubo = []
[hubo.append(v) for v in hubo1 if v not in hubo]
mtl = list(mt)
#집합 인덱싱을 위해 리스트로 변환
if linput[i] in mt:
if linput[i] not in hubo:
mt.remove(linput[i])
mtl.remove(linput[i])
#이미 있는 건데 이제 안 써? 뽑아
continue
#이미 있으면 그냥 지나감
for j in range(len(mtl)):
if mtl[j] not in hubo:
mt.remove(mtl[j])
mtl.remove(mtl[j])
break
#이제 꽂을 일 없는 전자기기는 빼버림
hubo.reverse()
if len(mt) == N: # 그래도 자리가 없으면
for j in range(len(hubo)):
if hubo[j] in mt:
mt.remove(hubo[j])
break
#맨 뒤에서부터 사용할 전자기기를 뺌
if len(mt) < N:
if linput[i] not in mt:
mt.add(linput[i])
count = count + 1
else:
print("Error")
exit()
print(count)
좋네요