Jun's Development Journey

[BOJ] 1700번 멀티탭 스케쥴링 본문

Algorithm/Greedy

[BOJ] 1700번 멀티탭 스케쥴링

J_Jayce 2021. 4. 8. 23:25

문제

www.acmicpc.net/problem/1700

 

1700번: 멀티탭 스케줄링

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

www.acmicpc.net

풀이

1) 잘못된 알고리즘 접근(각각의 카운팅을 먼저 해주고, 많이 사용하는 기계일 수록 나중에 뽑는 식으로 했었다.)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        int useCnt=0,answer=0;
        int[] seq = new int[K];
        int[] cnt = new int[101];
        boolean[] visited = new boolean[101];
        st = new StringTokenizer(br.readLine());
        for(int i=0;i<K;i++){
            seq[i] = Integer.parseInt(st.nextToken());
            cnt[seq[i]]++;
        }
        //계산
        ArrayList<Integer> consent = new ArrayList<>();
        for(int i=0;i<K;i++){
            int tmp = seq[i];
            if(!visited[tmp]){
                if(useCnt == N){//꽂을 곳이 없는 경우
                    //현재 꽂혀있는 코드 중 앞으로 나올 수가 가장 작거나 없는 걸 뽑는다.
                    int min_idx = 0, min = consent.get(min_idx);
                    for(int j=1;j<consent.size();j++){
                        if(consent.get(j) < consent.get(min_idx)){
                            min_idx = j;
                            min = consent.get(j);
                        }
                    }
                    visited[consent.get(min_idx)] = false;
                    consent.remove(min_idx);
                    consent.add(min_idx,tmp);
                    visited[tmp] = true;
                    answer++;
                }
                else{
                    cnt[tmp]--;
                    visited[tmp] = true;
                    consent.add(tmp);
                    useCnt++;
                }
            }
        }
        System.out.println(answer);
    }
}

2) 올바른 접근(구멍이 비었을 땐 그냥 넣고, 꽉 찼을 때는 콘센트에 있는 기계중 뒤에 누가 더 나중에 쓰이나를 구해서 계산한다.)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        int answer = 0;
        int[] seq = new int[K];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < K; i++)
            seq[i] = Integer.parseInt(st.nextToken());

        boolean[] visited = new boolean[101];
        ArrayList<Integer> consent = new ArrayList<>();
        ArrayList<Integer> list;
        for (int i = 0; i < K; i++) {
            int tmp = seq[i];
            if (!visited[tmp]) {
                if (consent.size() == N) {
                    list = new ArrayList<>();
                    answer++;
                    for (int j = i; j < K; j++) {
                        if (visited[seq[j]] && !list.contains(seq[j]))
                            list.add(seq[j]);
                    }
                    if(list.size()==N){//모두 뒤에서 쓰이는 경우
                        int remove = list.get(list.size()-1);
                        visited[remove] = false;
                    }
                    else{
                        for(int j=0;j<visited.length;j++){
                            if(visited[j] && !list.contains(j)){
                                visited[j] = false;
                                break;
                            }
                        }
                    }
                    visited[tmp] = true;
                } else {
                    consent.add(tmp);
                    visited[tmp] = true;
                }
            }
        }
        System.out.println(answer);
    }

}