코테/JAVA

[백준 1700 / JAVA] 머리탭 스케줄링

쇼티드 2024. 1. 20. 00:07
728x90
반응형

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

 

1700번: 멀티탭 스케줄링

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

www.acmicpc.net

 

간단히 말해 멀티탭에 연결한 플러그를 빼는 횟수를 최소화시키는 문제이다.

 

처음에는 남은 용품의 각각의 수를 계산하고 가장 적게 남은 상품을 교체하는 방식으로 잘못 풀었다.

 

올바른 방식은 다음 용품을 꽂아야 할 때 빼야 하는 플러그를 구하는 기준은 이후에 꽂는 순서가 가장 뒤인 용품이다.

예를 들어)2 7 / 2 3 2 3 1 2 7 에서 네번째 용품까지는 플러그를 뺄 일이 없다.

1을 연결해야 할 때 남은 용품인 2 7 에서 2가 먼저 오므로 3을 뺀다.

이런식으로 가장 나중에 사용되는 용품을 먼저 빼도록한다.

 

int i = 0;
        while (i < K) {
            if (!checkPlug(a[i])) { // 같은 번호가 플러그에 없을 때
                int change = choosePlug(i + 1);
                if (plug[change] != 0) { // 플러그를 바꿔야 할 때
                    result++;
                }
                plug[change] = a[i]; // 플러그 변경
            }

            i++;
        }

checkPlug 메서드는 같은 용품이 이미 플러그에 꽂혀있는지 확인하는 메서드이다.

choosePlug 메서드는 다음으로 빼야하는 플러그의 인덱스를 구하는 메서드이다.

 

    // 이미 같은 제품이 플러그에 있는지 확인
    public static boolean checkPlug(int a) {
        for (int i = 0; i < N; i++) {
            if (plug[i] == a)
                return true;
        }
        return false;
    }

같은 제품이 플러그에 있는지 확인한다.

 

    // 바꿀 플러그 확인
    public static int choosePlug(int next) {
        int result = 0, temp = 0, j;
        for (int i = 0; i < N; i++) {
            if (plug[i] == 0) // 빈 플러그가 있다면 선택
                return i;

            // 가장 먼저 사용되는 인덱스
            for (j = next; j < K; j++) {
                if (plug[i] == a[j])
                    break;
            }

            //더 늦게 사용되는 상품 저장
            if (j > temp) {
                temp = j;
                result = i;
            }
        }

        return result;
    }

만약 빈 플러그가 있다면 바로 그 인덱스를 반환한다.

아니라면 현재 인덱스의 플러그의 용품이 다음으로 언제 다시 사용되는지 확인하고

다시 사용되는 순서가 가장 늦는 제품을 꽂은 플러그의 인덱스를 찾는다.

 

전체코드

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

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

    public static void main(String[] args) throws IOException {
        String input;
        StringTokenizer st;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int result = 0;
        input = br.readLine();
        st = new StringTokenizer(input);

        N = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());
        plug = new int[N]; // 플러그 상태
        a = new int[K]; // 입력

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

        int i = 0;
        while (i < K) {
            if (!checkPlug(a[i])) { // 같은 번호가 플러그에 없을 때
                int change = choosePlug(i + 1);
                if (plug[change] != 0) { // 플러그를 바꿔야 할 때
                    result++;
                }
                plug[change] = a[i]; // 플러그 변경
            }

            i++;
        }

        System.out.println(result);
    }

    // 이미 같은 제품이 플러그에 있는지 확인
    public static boolean checkPlug(int a) {
        for (int i = 0; i < N; i++) {
            if (plug[i] == a)
                return true;
        }
        return false;
    }

    // 바꿀 플러그 확인
    public static int choosePlug(int next) {
        int result = 0, temp = 0, j;
        for (int i = 0; i < N; i++) {
            if (plug[i] == 0) // 빈 플러그가 있다면 선택
                return i;

            // 가장 먼저 사용되는 인덱스
            for (j = next; j < K; j++) {
                if (plug[i] == a[j])
                    break;
            }

            //더 늦게 사용되는 상품 저장
            if (j > temp) {
                temp = j;
                result = i;
            }
        }

        return result;
    }
}

 

728x90
반응형

'코테 > JAVA' 카테고리의 다른 글

[백준 13904 / JAVA] 과제  (0) 2024.01.20
[백준 2212 /JAVA] 센서  (0) 2024.01.20
[백준 1931 / JAVA] 회의실 배정  (0) 2024.01.18
[백준 11047 / JAVA] 동전 0  (0) 2024.01.18
[백준 1449 / JAVA] 수리공 항승  (0) 2024.01.16