본문 바로가기
Algorithm/Baekjoon

1700. 멀티탭 스케줄링 (Python)

by 원만사 2022. 3. 7.
반응형
 

1700번: 멀티탭 스케줄링

기숙사에서 살고 있는 준규는 한 개의 멀티탭을 이용하고 있다. 준규는 키보드, 헤어드라이기, 핸드폰 충전기, 디지털 카메라 충전기 등 여러 개의 전기용품을 사용하면서 어쩔 수 없이 각종 전

www.acmicpc.net

 

풀이

 페이지 교체 알고리즘 중 하나인 OPT(Optimal Replacement, 최적 교체)를 생각하면 된다. 일단 멀티탭 구멍에 맞게 각 전기용품을 꽂은 다음 현재 멀티탭에 없는 전기용품을 사용해야 할 경우 멀티탭을 사용 중인 용품 중 가장 먼 미래에 사용될 용품의 플러그를 빼고 새로운 용품의 플러그를 꽂도록 구현해주면 된다. 

 

코드

import sys

# 제거해야 할 전기용품을 찾기 위한 함수


def removePlug(idx):
    maxIdx = -1
    item = -1

    for plug in plugs:  # 멀티탭에 꽂아 놓은 전기용품 중
        try:
            tmpIdx = items.index(plug, idx)  # 현재 순서 이후에 언제 등장하는지를 찾는다.

            if tmpIdx > maxIdx:  # 가장 늦게 사용될 전기용품을 제거하도록 설정해준다.
                maxIdx = tmpIdx
                item = plug
        except:  # 만약 현재 순서 이후 사용되지 않는 전기용품이라면 바로 해당 전기용품을 제거하도록 해주면 된다.
            return plug

    return item


if __name__ == '__main__':
    N, K = map(int, input().split())  # N: 멀티탭 구멍의 개수, K: 전기 용품의 총 사용횟수
    items = list(map(int, input().split()))  # 전기용품 사용 순서 리스트

    if N >= K:  # 멀티탭 구멍이 전기 용품의 수 이상일 경우 플러그를 빼지 않아도 된다.
        print(0)
        sys.exit()

    plugs = []  # 현재 멀티탭에 꽂아 사용 중인 전기용품의 리스트
    res = 0  # 플러그 제거 횟수

    for i in range(K):
        item = items[i]

        # 아직 멀티탭에 사용할 수 있는 구멍이 있고 현재 전기 용품이 사용중이지 않을 경우
        # 제거할 필요 없이 꽂아서 사용하면 된다.
        if len(plugs) < N and item not in plugs:
            plugs.append(item)
            continue

        # 멀티탭에 남은 구멍이 없고 멀티탭에 없는 전기용품일 경우
        if item not in plugs:
            plugForRemove = removePlug(i)  # 제거해야 할 전기용품을 찾아서
            plugs.pop(plugs.index(plugForRemove))  # 해당 전기용품을 plugs에서 제거해주고
            plugs.append(item)  # 새로운 전기용품을 꽂는다.
            res += 1  # 플러그 제거 횟수 증가

    print(res)
반응형

'Algorithm > Baekjoon' 카테고리의 다른 글

9663. N-Queen (Python)  (0) 2022.03.08
9466. 텀 프로젝트 (Python)  (0) 2022.03.08
11000. 강의실 배정 (Python)  (0) 2022.03.07
2437. 저울 (Python)  (0) 2022.03.06
1339. 단어 수학 (Python)  (0) 2022.03.04

댓글