알고리즘문제풀이/백준

[BOJ]1700_멀티탭스케줄링

초보개발자.. 2021. 11. 22. 13:03

--문제--

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

 

1700번: 멀티탭 스케줄링

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

www.acmicpc.net

--문제 접근--

그리디 탐색의 문제
N=멀티탭 구멍의 개수 K는 전기용품의 총 사용 횟수 두 번째 줄에는 전기용품의 이름
 TC 1
 2 7
 2 3 2 3 1 2 7
고려해야할점
멀티탭의 개수, 나중에 이 용품이 다시 사용될 것인가? 이 두 가지를 중점적으로 생각해보기.
시나리오
1.멀티 탭이 여유롭다면 그냥 바로 꽂기
2. 여유가 없는데 만약 이미 꽂아진 전기용품이라면 그냥 skip
이제부터 크게 고려해야 할 점!!
만약 여유가 없는데 이미 꽂아진 전기용품도 아니라면 나중에 이 용품이 다시 사용될 것인가를 고려해야 합니다.
뽑아야 할 것중 나중에 사용할 것이 없다면 그것 뽑아서 바로 넣기.
둘 다 나중에 사용한 다면? 그중에 순서가 그나마 늦게 사용되는 것을 뽑기(여기서 중요한 점은 가장 나중에 사용되는 것을 고려할 때 중복을 허용하지 않는다는 점!)

package 준비운동;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class BOJ_1700_멀티탭스케줄링 {
//	그리디 탐색의 문제
//	N=멀티탭 구멍의 개수 K는 전기용품의 총 사용횟수 두번째 줄에는 전기용품의 이름
//	 TC 1
//	 2 7
//	 2 3 2 3 1 2 7
//	고려해야할점
//	멀티탭의 개수, 나중에 이 용품이 다시 사용될 것인가? 이 두가지를 중점적으로 생각해보기.
//	시나리오
//	1.멀티 탭이 여유롭다면 그냥 바로 꽂기
//	2.여유가 없는데 만약 이미 꽂아진 전기용품이라면 그냥 skip
//	이제부터 크게 고려해야할점!!
//	만약 여유가 없는데 이미 꽂아진 전기용품도아니라면 나중에 이 용품이 다시 사용될 것인가를 고려해야합니다.
//	뽑아야 할 것중 나중에 사용할 것이 없다면 그것 뽑아서 바로 넣기.
//	둘다 나중에 사용한 다면 ? 그중에 순서가 그나마 늦게 사용되는 것을 뽑기
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		LinkedList<Integer> left=new LinkedList<>();
		LinkedList<Integer> right=new LinkedList<>();
		List<Integer> temp=new ArrayList<>();
		int N=sc.nextInt();
		int K=sc.nextInt();
		int[] elect=new int[K];
		int tmp=0;
		for(int i=0;i<K;i++) {
			int n=sc.nextInt();
			elect[i]=n;
			//1번과정
			if(tmp<N) {
				if(!left.contains(n)) {
					left.add(n);
					tmp++;
				}else {
					continue;
				}
			}
			else right.add(n);
		}
		int ans=0;
		int size=right.size();
		for(int i=0;i<size;i++) {
			int n=right.poll();
			if(left.contains(n)) {
				continue;
			}
			temp=new ArrayList<>();
			boolean check=false;
		
			for(int j=0;j<N;j++) {
				if(!right.contains(left.get(j))) {
					
					left.remove(left.indexOf(left.get(j)));
					left.add(n);
					ans++;
					check =true;
					break;
				}
			}
			if(check)continue;
			for(int j=0;j<right.size();j++) {
				if(left.contains(right.get(j))&&!temp.contains(right.get(j))) {
					temp.add(right.get(j));
				}
			}
			
			int tempV=temp.get(temp.size()-1);
			ans++;
			left.remove(left.indexOf(tempV));
			left.add(n);
		}
		System.out.println(ans);
		
		
 	}
}