https://www.acmicpc.net/problem/1700
코드
n, k = map(int, input().split())
orders = list(map(int, input().split()))
answer = 0
multitap = set()
for i in range(k):
# 이미 꽂혀있는지 확인
if orders[i] in multitap:
continue
# 빈 칸이 있는지 확인
if len(multitap) < n:
multitap.add(orders[i])
continue
# 교체
change_plug = -1
max_latest_use = -1
for plug in multitap:
if plug not in orders[i+1:]:
change_plug = plug
break
latest_use = orders[i+1:].index(plug)
if latest_use > max_latest_use:
change_plug = plug
max_latest_use = latest_use
multitap.remove(change_plug)
multitap.add(orders[i])
answer += 1
print(answer)
멀티탭에 빈 칸이 있다면 거기에 꽂고, 아니라면 가장 나중에 다시 사용되는 플러그를 찾아서 뽑고 거기에 꽂으면 된다. 물론 이미 꽂혀있는 플러그라면 이 과정이 다 필요없다.
그래서 전기용품의 순서를 저장해둔 배열인 `orders`를 순회하며 다음 과정을 반복한다.
1. 이미 꽂혀있는지 확인. 이미 꽂혀있는 경우에는 아래 과정을 해볼 필요가 없으므로 먼저 확인해보는 것이 필요하다.
2. 빈 칸이 있는지 확인. 만약 multitap 배열의 크기가 n보다 작다면 멀티탭의 N개 구멍을 모두 사용하지 않고 있는 것이므로 빈 칸에 꽂아주면 된다.
3. 멀티탭에 이미 꽂혀있는 플러그 중 다시 사용 안되거나 가장 나중에 사용될 플러그를 찾아서 교체하기. 다시 사용되는 순서가 가장 나중인 플러그를 빼고 새로운 플러그를 꽂아야 최소한으로 플러그를 빼면서 작업을 모두 완료할 수 있다.
'문제풀이 > Greedy' 카테고리의 다른 글
[Python/파이썬] 백준 17615번 볼 모으기 (0) | 2025.02.19 |
---|---|
[Python/파이썬] 프로그래머스 단속카메라 (0) | 2024.10.26 |
[Python/파이썬] 백준 2374번 같은 수로 만들기 (0) | 2024.06.18 |
[Python/파이썬] SW Expert Academy 20936번 상자 정렬하기 (0) | 2024.06.10 |
[Python/파이썬] 백준 1455번 뒤집기 II (1) | 2024.06.09 |