Algorithm, boj, 멀티탭 스케줄링(1700)

문제유형

  • greedy 문제

    한마디

  • 어려운 문제가 아닌데 해결방법을 코드로 구현하는게 힘들었다

    해결

  • 가장 나중에 사용할 기계의 콘센트를 뽑으면 된다
package org.tryAgain;
// https://www.acmicpc.net/problem/1700

import java.util.*;

public class test1700_greedy_multiTap {

	public static void main(String[] args) {
		int answer=0;
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int K = sc.nextInt();
		int[] machine = new int[K];
		for(int i=0; i<K; i++) {
			machine[i] = sc.nextInt();
		}

		boolean[] check = new boolean[3];
		List<Integer> tap = new ArrayList<>();
		tap.add(machine[0]);
		for (int i=1; i<machine.length; i++) {



			boolean is_exist = false;
			// 탭에 이미 꽂혀있는지 확인
			for(int j=0; j<tap.size();j++) {
				if(tap.get(j) == machine[i]) {
					is_exist = true;
					break;
				}
			}

			// 이미 꽂혀있으면 끝
			if(is_exist == true)
				continue;

			// 이미 꽂혀있는게 아니고, 탭에 빈자리가 있다면 꽂는다
			if(tap.size() < N) {
				tap.add(machine[i]);
				continue;
			}

			int maxSubIdx=0 ,maxTapIdx=0;
			// 이미 꽂혀있는게 아니고, 탭에 빈자리가 없다면
			// 사용중인 기계중 제일 마지막에 재사용 될것을 고른다
			for(int tapIdx=0; tapIdx<N; tapIdx++) {
				// 뒤쪽에서 사용안한다면 순서는 무한대값이다
				int maxIdx = Integer.MAX_VALUE;

				for(int subIdx = i+1; subIdx<machine.length; subIdx++) {
					// 뒤쪽에서 사용될 순서값
					if(tap.get(tapIdx) == machine[subIdx]) {
						maxIdx = subIdx;
						break;
					}

				}
				// 사용될 순서값이 가장 것을 찾는다
				if(maxSubIdx < maxIdx) {
					maxSubIdx = maxIdx;
					maxTapIdx = tapIdx;
				}
			}
			tap.set(maxTapIdx, machine[i]);
			answer++;
		}
		System.out.println(answer);
	}

}


Reference