멀티탭 구멍의 개수가 주어지고, 전기 용품의 사용 순서가 주어질 때,
최대한 플로그 뽑는 횟수를 적게하여 그 횟수를 출력해내면 된다.
예시
- 멀티탭 구멍의 개수 : 3
- 사용하는 전자기기 순서 : 키보드 > 드라이기 > 충전기 > 커피포터 > 키보드 > 드라이기
이때 키보드, 드라이기, 충전기의 플러그를 순서대로 꽂은 후,
나중에 다시 사용하지 않는 충전기 플러그를 뺀 후, 커피포터 플러그를 꽂으면 된다.
=> 총 1번만 빼면 된다.
입력 : 멀티탭 구멍의 개수 N
, 전기 용품의 총 사용횟수 K
, 전기용품의 이름과 사용순서
2 7
2 3 2 3 1 2 7
출력 : 플러그를 빼는 최소의 횟수
상황을 3가지로 나누어서 판단하면 된다.
1. 사용할 전자기기 플러그가 이미 꽂혀 있을 때
2. 플러그를 꽂을 빈 자리가 있을 때
3. 빈 자리가 없을 때
꼭 3가지 경우를 순서대로 판단해야한다.
🚨 만약 멀티탭 구멍이 3개고, ( 물건1
, 물건2
, [빈자리]
)라고 했을 때 사용할 물건이 물건1
이라면 빈자리가 아니라 그냥 넘겨야할 상황이기 때문!
int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);int N, K; // 멀티탭 구멍의 개수, 전기용품의 총 사용횟수 cin >> N >> K; int *order = new int[K]; // 순서 받기 for (int i=0; i<K; i++) { cin >> order[i]; } int *tap = new int[N]; // 멀티탭 배열 for (int k=0; k<N; k++) { tap[k] = 0; } int cnt = 0; for (int j=0; j<K; j++) { bool pass = false; // 이미 꽂혀있는지 확인 for (int i=0; i<N; i++) { if (order[j] == tap[i]) { pass = true; break; } } if (pass) continue; // 빈 곳이 있는지 확인 for (int i=0; i<N; i++) { if (tap[i] == 0) { tap[i] = order[j]; pass = true; break; } } if (pass) continue; // 그 외 int pos = -1; // 멀티탭에서 뺄 자리 int idx = -1; // schedule이 가장 나중에 잡혀있는 것 for (int i=0; i<N; i++) { // 멀티탭 번아 가면서 확인 int tmp = 0; // 순서를 확인해야하므로 for (int k=j+1; k<K; k++) { if (tap[i] == order[k]) break; // 그 다음 스케줄 중에 멀티탭에 꽂혀있는 전자기기가 잡혀있다면 tmp++; } if (tmp > idx) { pos = i; idx = tmp; } } tap[pos] = order[j]; cnt++; } cout << cnt; return 0; }
tap[]
: 멀티탭 구멍order[]
: 스케쥴러이미 꽂혀있는 전자기기라면 pass
for (int i=0; i<N; i++) {
if (order[j] == tap[i]) {
pass = true; // 그냥 넘기기
break;
}
}
if (pass) continue;
빈 곳이 있다면 빈 곳 사용
for (int i=0; i<N; i++) {
if (tap[i] == 0) {
tap[i] = order[j]; // 빈 곳에 해당 전자기기 꽂기
pass = true; // pass
break;
}
}
if (pass) continue;
빈 곳이 없으면 가장 나중에 사용하는 전자기기 플러그 뽑기
int pos = -1; // 멀티탭에서 뺄 자리
int idx = -1; // schedule이 가장 나중에 잡혀있는 것
for (int i=0; i<N; i++) { // 멀티탭 번아 가면서 확인
int tmp = 0; // 순서를 확인해야하므로
for (int k=j+1; k<K; k++) {
if (tap[i] == order[k]) break; // 그 다음 스케줄 중에 멀티탭에 꽂혀있는 전자기기가 잡혀있다면
tmp++;
}
if (tmp > idx) {
pos = i;
idx = tmp;
}
}
tap[pos] = order[j];
cnt++;
위 상황은 2
, 3
번이 꽂혀있고, 1
을 사용할 차례이다. 이때 3
이 더 나중에 사용하므로 3
을 뽑는다.
위 상황은 2
, 3
번이 꽂혀있고, 1
을 사용할 차례이다. 이때 꽂혀있는 3
을 더이상 사용하지 않을 것이므로 3
을 뽑는다.