-
[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); } }
'알고리즘문제풀이 > 백준' 카테고리의 다른 글
[BOJ]1789_수들의합_Java (0) 2021.11.23 [BOJ]1916_최소비용구하기_JAVA (0) 2021.11.22 [BOJ]1062_가르침_JAVA (0) 2021.10.22 [BOJ]14719_빗물_JAVA (0) 2021.10.21 [BOJ]2178_JAVA_미로탐색 (0) 2021.10.18