본문 바로가기
Algorithm

[백준 Gold 1] 1700 멀티탭 스케줄링 - Java

by Ray 2021. 12. 24.

문제링크 : https://www.acmicpc.net/problem/1700

 

1700번: 멀티탭 스케줄링

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

www.acmicpc.net

 

접근 과정 : 

  • 문제를 보자마자, 페이지 교체 알고리즘 중 최적 페이지 교체 알고리즘이 생각났다.
  • 실제로는, 미래에 어떤 페이지를 가장 사용하지 않을지 모르기에 사용할 수 없는 알고리즘.
  • 그러나 문제에는 어떤 전기용품들이 사용될 지 알려주고 있다.!!!!
  • 현재 사용중인 전기용품들중, 가장 오랫동안 사용되지 않을 전기용품을 교체한다!!

 

소스 코드 및 결과 :

package BOJ;

/* 
    멀티탭 스케줄링
*/

import java.io.*;
import java.util.*;

public class BOJ1700 {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        int[] tool = new int[K];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < K; i++) {
            tool[i] = Integer.parseInt(st.nextToken());
        }
        br.close();

        int change = 0;

        if (N == 1) {
            for(int i = 1; i<K; i++){
                if (tool[i] != tool[i-1]) {
                    change++;
                }
            }

        } else {
            HashSet<Integer> multitap = new HashSet<>();

            for (int i = 0; i < K; i++) {

                if (multitap.contains(tool[i])) {
                    continue;
                }

                if (multitap.size() < N) {
                    multitap.add(tool[i]);
                } else {
                    HashSet<Integer> temp = new HashSet<>(multitap);
                    for (int j = i + 1; j < K; j++) {
                        if (temp.contains(tool[j])) {
                            temp.remove(tool[j]);
                        }
                        if (temp.size() < 2) {
                            break;
                        }
                    }

                    multitap.remove(temp.iterator().next());
                    multitap.add(tool[i]);
                    change++;
                }
            }
        }

        System.out.println(change);

    }
}

 

P.S 

앞으로 가장 사용되지 않을 전기용품을 고르기 위해, MultiTap HashSet을 새로운 Temp HashSet으로 복사한다..

문제에서는 멀티탭의 크기가 어마어마하게 크지 않아서 괜찮았다.

다만, 이러한 부분을 고려해서 더 좋은 방법을 찾으면 더 좋지 않을까..