[BaekJoon] 1700 멀티탭 스케쥴링 (Java)

오태호·2023년 6월 2일
0

백준 알고리즘

목록 보기
239/395
post-thumbnail

1.  문제 링크

https://www.acmicpc.net/problem/1700

2.  문제


3.  소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
    static int N, K;
    static int[] electricalGoodsOrder;

    static void input() {
        Reader scanner = new Reader();

        N = scanner.nextInt();
        K = scanner.nextInt();
        electricalGoodsOrder = new int[K];

        for(int idx = 0; idx < K; idx++) electricalGoodsOrder[idx] = scanner.nextInt();
    }

    static void solution() {
        boolean[] isUsed = new boolean[K + 1];
        int usedPlugNum = 0, answer = 0;

        for(int electricalGoodIdx = 0; electricalGoodIdx < K; electricalGoodIdx++) {
            int electricalGood = electricalGoodsOrder[electricalGoodIdx];

            if(!isUsed[electricalGood]) {
                if(usedPlugNum < N) { // 콘센트 꽂을 공간이 있는 경우
                    isUsed[electricalGood] = true;
                    usedPlugNum++;
                } else { // 콘센트 꽂을 공간이 없는 경우
                    List<Integer> willUseElectricalGoodList = new ArrayList<>();
                    // 나중에 사용되는 현재 꽂혀있는 콘센트 구하기
                    for(int idx = electricalGoodIdx; idx < K; idx++) {
                        if(isUsed[electricalGoodsOrder[idx]] && !willUseElectricalGoodList.contains(electricalGoodsOrder[idx]))
                            willUseElectricalGoodList.add(electricalGoodsOrder[idx]);
                    }

                    // 나중에도 사용되는 콘센트가 구멍의 개수보다 작을 경우
                    if(willUseElectricalGoodList.size() < N) {
                        // 나중에 사용되지 않는 콘센트 빼기
                        for(int electricalGoodNum = 1; electricalGoodNum < isUsed.length; electricalGoodNum++) {
                            if(isUsed[electricalGoodNum] && !willUseElectricalGoodList.contains(electricalGoodNum)) {
                                isUsed[electricalGoodNum] = false;
                                break;
                            }
                        }
                    } else {
                        // 꽂혀있는 것 중 하나 제거
                        int removePlug = willUseElectricalGoodList.get(willUseElectricalGoodList.size() - 1);
                        isUsed[removePlug] = false;
                    }

                    // 사용되는 전기용품을 꽂고 하나의 플러그를 제거했기 때문에 answer 1 증가
                    isUsed[electricalGood] = true;
                    answer++;
                }
            }
        }

        System.out.println(answer);
    }

    public static void main(String[] args) {
        input();
        solution();
    }

    static class Reader {
        BufferedReader br;
        StringTokenizer st;

        public Reader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        String next() {
            while(st == null || !st.hasMoreElements()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            return st.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(next());
        }
    }
}
profile
자바, 웹 개발을 열심히 공부하고 있습니다!

0개의 댓글