삐까냥의 파도타기

1700번) 멀티탭 스케줄링 - 그리디 본문

코딩/백준 알고리즘

1700번) 멀티탭 스케줄링 - 그리디

금손형아 2017. 10. 27. 19:16


문제 출처 : https://www.acmicpc.net/problem/1700



import java.util.Scanner;


public class Q1700 {


static int[][] multiTab;

static int[] jobList;

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int size = sc.nextInt(); //구멍 개수

int num = sc.nextInt();


multiTab = new int[size][2];

jobList = new int[num];

for ( int i = 0; i < num; i++ ) {

jobList[i] = sc.nextInt();

}

int nowPoint = 0;

int result = 0;

while ( nowPoint < num ) {

if ( !isExist(size, nowPoint) ) { //사용할 전자기기를 지금은 사용하지 않는 중

int changeNumber = 0;

for ( int i = 0; i < size; i++ ) { //현재 사용중인 전자기기마다 얼마나 나중에 사용할 지 계산하기

int temp = multiTab[i][0];

multiTab[i][1] = 0;

for ( int j = nowPoint; j < num; j++ ) {

if ( temp == jobList[j] ) { //언제 사용할지 발견했으면

multiTab[i][1] = j - nowPoint + 1; //언제 사용할지 기록

break;

}

}

if ( multiTab[i][1] == 0 ) { //앞으로 사용하지 않은 전자기기를 발견하면 바로 교체하기

changeNumber = i;

break;

}

//제일 나중에 사용하는 전자기기 기록

changeNumber = multiTab[changeNumber][1] > multiTab[i][1] ? changeNumber : i;

}

//새로운 전자기기 사용하기

multiTab[changeNumber][0] = jobList[nowPoint];

result++;

}

nowPoint++;

}

System.out.println(result - size);

}

static boolean isExist(int size, int nowPoint) {

for ( int j = 0; j < size; j++ ) {

if ( multiTab[j][0] == jobList[nowPoint] ) { //이미 있다면

return true;

}

}

return false;

}


뭔가 깔끔하지 못한 코드 입니다.


하.... 나중에 다시 도전!

'코딩 > 백준 알고리즘' 카테고리의 다른 글

1068번) 트리 - 그래프  (0) 2017.10.28
4963번) 섬의 개수 - 그래프  (0) 2017.10.28
1049번) 기타줄 - 그리디  (0) 2017.10.27
2875번) 대회 or 인턴 - 그리디  (0) 2017.10.27
10610번) 30 - 그리디  (0) 2017.10.27