[Baekjoon/๋ฐฑ์ค][1966][C/C++] ํ๋ฆฐํฐ ํ
ใ๋ชฉ์ฐจใ
0. ๊ฐ์
1. ๋ฌธ์
2. ํ์ด
3. ์ฝ๋
0. ๊ฐ์
๊ตฌํ, ์๋ฃ๊ตฌ์กฐ, ์๋ฎฌ๋ ์ด์ , ํ ๋ฌธ์ . ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ๋ฉด ์ฝ๊ฒ ํ ์ ์์ง๋ง, ํ์๋ ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ์ง ์๊ณ ๋จ์ ํ๋ง ์ด์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ์๋ค. ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ ๋ค๋ฅธ ๋ถ์ ํ์ด๋ ํจ๊ป ์ฒจ๋ถํ๋๋ก ํ๊ฒ ๋ค.
1. ๋ฌธ์
https://www.acmicpc.net/problem/1966
[๋ฌธ์ ]
์ฌ๋ฌ๋ถ๋ ์๋ค์ํผ ์ฌ๋ฌ๋ถ์ ํ๋ฆฐํฐ ๊ธฐ๊ธฐ๋ ์ฌ๋ฌ๋ถ์ด ์ธ์ํ๊ณ ์ ํ๋ ๋ฌธ์๋ฅผ ์ธ์ ๋ช ๋ น์ ๋ฐ์ ‘์์๋๋ก’, ์ฆ ๋จผ์ ์์ฒญ๋ ๊ฒ์ ๋จผ์ ์ธ์ํ๋ค. ์ฌ๋ฌ ๊ฐ์ ๋ฌธ์๊ฐ ์์ธ๋ค๋ฉด Queue ์๋ฃ๊ตฌ์กฐ์ ์์ฌ์ FIFO - First In First Out - ์ ๋ฐ๋ผ ์ธ์๊ฐ ๋๊ฒ ๋๋ค. ํ์ง๋ง ์๊ทผ์ด๋ ์๋ก์ด ํ๋ฆฐํฐ๊ธฐ ๋ด๋ถ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ์๋๋ฐ, ์ด ํ๋ฆฐํฐ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ธ์๋ฅผ ํ๊ฒ ๋๋ค.
- ํ์ฌ Queue์ ๊ฐ์ฅ ์์ ์๋ ๋ฌธ์์ ‘์ค์๋’๋ฅผ ํ์ธํ๋ค.
- ๋๋จธ์ง ๋ฌธ์๋ค ์ค ํ์ฌ ๋ฌธ์๋ณด๋ค ์ค์๋๊ฐ ๋์ ๋ฌธ์๊ฐ ํ๋๋ผ๋ ์๋ค๋ฉด, ์ด ๋ฌธ์๋ฅผ ์ธ์ํ์ง ์๊ณ Queue์ ๊ฐ์ฅ ๋ค์ ์ฌ๋ฐฐ์น ํ๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ๋ฐ๋ก ์ธ์๋ฅผ ํ๋ค.
์๋ฅผ ๋ค์ด Queue์ 4๊ฐ์ ๋ฌธ์(A B C D)๊ฐ ์๊ณ , ์ค์๋๊ฐ 2 1 4 3 ๋ผ๋ฉด C๋ฅผ ์ธ์ํ๊ณ , ๋ค์์ผ๋ก D๋ฅผ ์ธ์ํ๊ณ A, B๋ฅผ ์ธ์ํ๊ฒ ๋๋ค.
์ฌ๋ฌ๋ถ์ด ํ ์ผ์, ํ์ฌ Queue์ ์๋ ๋ฌธ์์ ์์ ์ค์๋๊ฐ ์ฃผ์ด์ก์ ๋, ์ด๋ค ํ ๋ฌธ์๊ฐ ๋ช ๋ฒ์งธ๋ก ์ธ์๋๋์ง ์์๋ด๋ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด ์์ ์์์ C๋ฌธ์๋ 1๋ฒ์งธ๋ก, A๋ฌธ์๋ 3๋ฒ์งธ๋ก ์ธ์๋๊ฒ ๋๋ค.
[์ ๋ ฅ]
์ฒซ ์ค์ ํ ์คํธ์ผ์ด์ค์ ์๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ์ผ์ด์ค๋ ๋ ์ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
ํ ์คํธ์ผ์ด์ค์ ์ฒซ ๋ฒ์งธ ์ค์๋ ๋ฌธ์์ ๊ฐ์ N(1 ≤ N ≤ 100)๊ณผ, ๋ช ๋ฒ์งธ๋ก ์ธ์๋์๋์ง ๊ถ๊ธํ ๋ฌธ์๊ฐ ํ์ฌ Queue์์ ๋ช ๋ฒ์งธ์ ๋์ฌ ์๋์ง๋ฅผ ๋ํ๋ด๋ ์ ์ M(0 ≤ M < N)์ด ์ฃผ์ด์ง๋ค. ์ด๋ ๋งจ ์ผ์ชฝ์ 0๋ฒ์งธ๋ผ๊ณ ํ์. ๋ ๋ฒ์งธ ์ค์๋ N๊ฐ ๋ฌธ์์ ์ค์๋๊ฐ ์ฐจ๋ก๋๋ก ์ฃผ์ด์ง๋ค. ์ค์๋๋ 1 ์ด์ 9 ์ดํ์ ์ ์์ด๊ณ , ์ค์๋๊ฐ ๊ฐ์ ๋ฌธ์๊ฐ ์ฌ๋ฌ ๊ฐ ์์ ์๋ ์๋ค.
[์ถ๋ ฅ]
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ๋ฌธ์๊ฐ ๋ช ๋ฒ์งธ๋ก ์ธ์๋๋์ง ์ถ๋ ฅํ๋ค.
[์์ ์ ๋ ฅ 1]
3
1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1
[์์ ์ถ๋ ฅ 1]
1
2
5
2. ํ์ด
/* ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ์ง ์์ ํ์ด */
ํ์ด์ ๋ก์ง์ ๋ค์๊ณผ ๊ฐ๋ค. ์๋์ ๋ก์ง์ ์ฝ๋๋ก ๊ตฌํํ์๋ค.
/* ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ ํ์ด */
์ฐ์ ์์ ํ๋ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ๋ฐ์ดํฐ๋ถํฐ ๋จผ์ ์ญ์ ํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
์ฐ์ ์์ ํ๋ ๋ฐฐ์ด, ์ฐ๊ฒฐ๋ฆฌ์คํธ, ํ ๋ฑ์ผ๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ๋ฐ, ์ด ์ค์์ ํ(heap)์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ด ๊ฐ์ฅ ํจ์จ์ ์ด๋ค.
ํ์ ์์ ์ด์ง ํธ๋ฆฌ์ ์ผ์ข ์ผ๋ก, ์ฐ์ ์์ ํ๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
์ด๋ ์ฌ๋ฌ ๊ฐ์ ๊ฐ๋ค ์ค์์ ์ต๋๊ฐ์ด๋ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋๋ก ๋ง๋ค์ด์ง ์๋ฃ๊ตฌ์กฐ์ด๋ค.
ํ์ ์ผ์ข
์ ๋ฐ์ ๋ ฌ ์ํ (๋์จํ ์ ๋ ฌ ์ํ)๋ฅผ ์ ์งํ๋ค.
๋ค์ ๋งํด, ๋ถ๋ชจ ๋ ธ๋์ ํค ๊ฐ์ด ์์ ๋ ธ๋์ ํค ๊ฐ๋ณด๋ค ํญ์ ์๊ฑฐ๋ ํฐ ์ด์ง ํธ๋ฆฌ๋ฅผ ์ ์งํ๋ค.
ํ์์๋ ์ค๋ณต๋ ๊ฐ์ ํ์ฉํ๋ค.
์ต๋ ํ(max heap)
"๋ถ๋ชจ ๋
ธ๋์ key ๊ฐ >= ์์ ๋
ธ๋์ key ๊ฐ"์ ๋ง์กฑํ๋ ์์ ์ด์ง ํธ๋ฆฌ
์ต์ ํ(min heap)
"๋ถ๋ชจ ๋
ธ๋์ key ๊ฐ =< ์์ ๋
ธ๋์ key ๊ฐ"์ ๋ง์กฑํ๋ ์์ ์ด์ง ํธ๋ฆฌ
์ด ๋ฌธ์ ์์๋ ์ค์๋๊ฐ ๋์ ๋ฌธ์์ผ์๋ก ๊ฐ์ฅ ๋จผ์ ์ธ์ํด์ผ ํ๋ฏ๋ก ์ต๋ ํ์ ์ฌ์ฉํ๋ฉด ๋๋ค!
3. ์ฝ๋
/* ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ์ง ์์ ํ์ด */
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int main(int argc, char* argv[]) {
/* Faster */
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
/* Input */
int T; cin >> T;
for (int i = 0; i < T; i++) {
/* Input */
int N, M; cin >> N >> M;
/* Init */
int arr[10] = {};
queue<pair<int, bool>> q;
bool flag = false; //๋ฐ๋ณต๋ฌธ ํ์ถ์ ์ํ flag ๋ณ์
for (int j = 0; j < N; j++) {
int elem; cin >> elem;
arr[elem]++;
q.push(make_pair(elem, j == M));
}
/* Calculate */
for (int j = 9; j >= 0; j--) {
while (arr[j] > 0) {
if (j == q.front().first) {
if (q.front().second == true) {
cout << N - q.size() + 1 << '\n';
flag = true;
break;
}
q.pop();
arr[j]--;
}
else { // j != q.front().first
q.push(q.front());
q.pop();
}
}
if (flag == true)
break;
}
}
/* End */
return 0;
}
/*
//debug
for (int j = 0; j < 10; j++) {
cout.width(3);
cout << j << ' ';
}
cout << '\n';
for (int j = 0; j < 10; j++) {
cout.width(3);
cout << arr[j] << ' ';
}
cout << '\n';
while (!q.empty()) {
cout.width(3);
cout << q.front().first << '&' << q.front().second << ' ';
q.pop();
}
cout << '\n';
*/
/* ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ ํ์ด */
#include<iostream>
#include<queue>
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--){
int n, m;
cin >> n >> m;
// ์ธ๋ฑ์ค๊ฐ m์ธ ๋ฌธ์๊ฐ ๋ช๋ฒ์งธ๋ก ์ธ์๋์๋์ง ์นด์ดํ
ํ๋ ๋ณ์
int cnt = 0;
queue<pair<int, int>> q;
priority_queue<int> pq; // ๊ธฐ๋ณธ์ ์ผ๋ก ์ต๋ ํ
for (int i = 0; i < n; i++){
int x;
cin >> x;
q.push({ i, x }); // ์ธ๋ฑ์ค์ ์ค์๋
pq.push(x); // ์ค์๋๊ฐ ๋์ ์์ผ๋ก
}
while (!q.empty()){
// ํ์ front ์์๋ฅผ ๊บผ๋ด์
int idx = q.front().first;
int priority = q.front().second;
q.pop();
// ์ฐ์ ์์ ํ์ top๊ณผ ์ค์๋๊ฐ ์ผ์นํ๋ฉด
if (pq.top() == priority){
pq.pop();
cnt++; // ๋ฌธ์ ํ๋ ์ธ์ํ ๋๋ง๋ค ์ฆ๊ฐ
// ํ์ฌ ๋ฌธ์์ ์ธ๋ฑ์ค๊ฐ m์ธ ๊ฒฝ์ฐ
if (idx == m){
// ๋ช๋ฒ์งธ๋ก ์ธ์๋์๋์ง ์ถ๋ ฅ
cout << cnt << '\n';
break; // ๊ทธ ๋ค์ ํ
์คํธ ์ผ์ด์ค๋ก ๋์ด๊ฐ๊ธฐ
}
}
else {
// ์ค์๋๊ฐ ๋์ง ์์ผ๋ฉด ํ์ rear์ ๋ค์ push
q.push({ idx, priority });
}
}
// ๊ฐ ํ
์คํธ ์ผ์ด์ค๋ง๋ค q, pq๋ฅผ ์๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์
// ์ปจํ
์ด๋ ์ด๊ธฐํ๋ ํ์ํ์ง ์๋ค.
}
return 0;
}