Jun's Development Journey
[BOJ] 1700번 멀티탭 스케쥴링 본문
문제
1700번: 멀티탭 스케줄링
기숙사에서 살고 있는 준규는 한 개의 멀티탭을 이용하고 있다. 준규는 키보드, 헤어드라이기, 핸드폰 충전기, 디지털 카메라 충전기 등 여러 개의 전기용품을 사용하면서 어쩔 수 없이 각종 전
www.acmicpc.net
풀이
1) 잘못된 알고리즘 접근(각각의 카운팅을 먼저 해주고, 많이 사용하는 기계일 수록 나중에 뽑는 식으로 했었다.)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int useCnt=0,answer=0;
int[] seq = new int[K];
int[] cnt = new int[101];
boolean[] visited = new boolean[101];
st = new StringTokenizer(br.readLine());
for(int i=0;i<K;i++){
seq[i] = Integer.parseInt(st.nextToken());
cnt[seq[i]]++;
}
//계산
ArrayList<Integer> consent = new ArrayList<>();
for(int i=0;i<K;i++){
int tmp = seq[i];
if(!visited[tmp]){
if(useCnt == N){//꽂을 곳이 없는 경우
//현재 꽂혀있는 코드 중 앞으로 나올 수가 가장 작거나 없는 걸 뽑는다.
int min_idx = 0, min = consent.get(min_idx);
for(int j=1;j<consent.size();j++){
if(consent.get(j) < consent.get(min_idx)){
min_idx = j;
min = consent.get(j);
}
}
visited[consent.get(min_idx)] = false;
consent.remove(min_idx);
consent.add(min_idx,tmp);
visited[tmp] = true;
answer++;
}
else{
cnt[tmp]--;
visited[tmp] = true;
consent.add(tmp);
useCnt++;
}
}
}
System.out.println(answer);
}
}
2) 올바른 접근(구멍이 비었을 땐 그냥 넣고, 꽉 찼을 때는 콘센트에 있는 기계중 뒤에 누가 더 나중에 쓰이나를 구해서 계산한다.)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int answer = 0;
int[] seq = new int[K];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < K; i++)
seq[i] = Integer.parseInt(st.nextToken());
boolean[] visited = new boolean[101];
ArrayList<Integer> consent = new ArrayList<>();
ArrayList<Integer> list;
for (int i = 0; i < K; i++) {
int tmp = seq[i];
if (!visited[tmp]) {
if (consent.size() == N) {
list = new ArrayList<>();
answer++;
for (int j = i; j < K; j++) {
if (visited[seq[j]] && !list.contains(seq[j]))
list.add(seq[j]);
}
if(list.size()==N){//모두 뒤에서 쓰이는 경우
int remove = list.get(list.size()-1);
visited[remove] = false;
}
else{
for(int j=0;j<visited.length;j++){
if(visited[j] && !list.contains(j)){
visited[j] = false;
break;
}
}
}
visited[tmp] = true;
} else {
consent.add(tmp);
visited[tmp] = true;
}
}
}
System.out.println(answer);
}
}