1700. 멀티탭 스케줄링
BJ1700
풀이 방식에 대해선 추가 예정입니다.
2019년도 대학생때 풀어본 방식이여서 풀이방식 해석 후 작성 해보려합니다.
문제
https://www.acmicpc.net/problem/1700
풀이 방식
구현코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <algorithm>
using namespace std;
int iArray[101];
int iStack[101];
int iCheck[101]; // Stack의 위치값이 언제 사용이 되는지
int main() {
int N, M;
int iVal;
int iAnswer = 0;
int iPointer;
int iMax = -1;
int iMaxIndex = 0;
bool bCheck = false;
scanf("%d %d", &N, &M);
for(int i = 0; i < M; i++) {
scanf("%d", &iArray[i]);
}
iPointer = N;
/// 초기 N칸 채워넣기
for(int i = 0; i < iPointer; i++) {
bCheck = false;
for(int j = 0; j < i; j++) {
if(iStack[j] == iArray[i]) {
iPointer++;
bCheck = true;
break;
}
}
if(bCheck) continue;
iStack[i-(iPointer-N)] = iArray[i];
}
/// 초기 N칸 채워넣기
for(int a = iPointer; a < M; a++) {
bCheck = false;
for(int i = 0; i < N; i++) {
if(iStack[i] == iArray[a]) {
bCheck = true;
iPointer++;
break;
}
}
if(bCheck) continue;
//각 스택의 값들의 미래를 봐서 가장 최근에 들어올 위치
for(int i = 0; i < N; i++) {
for(int j = iPointer; j < M; j++) {
if(iStack[i] == iArray[j]) {
iCheck[i] = j;
break;
}
if( j == M-1) {
iCheck[i] = 101;
}
}
}
for(int i = 0; i < N; i++) {
if(iCheck[i] > iMax) {
iMax = iCheck[i];
iMaxIndex = i;
}
}
iStack[iMaxIndex] = iArray[a];
iAnswer++;
iMax = -1;
iPointer++;
}
printf("%d", iAnswer);
}
728x90
728x90