[BOJ] 백준 1966 프린터 큐
문제 링크 : https://www.acmicpc.net/problem/1966
큐의 특성인 FIFO는 모두 알고 있습니다. 이 문제는 원하는 인덱스의 숫자를 몇번째에
출력해 낼 수 있느냐를 묻고 있습니다.
문자열을 출력하는 조건은 큐에 출력하려는 문자보다 큰 숫자가 있으면 큰 숫자먼저 출력하고, 출력하려는 인덱스의 숫자가 가장 크고 가장 앞에 있을 때 출력이 가능합니다.
이를 위해서 큐의 자료형을 클래스 선언 합니다.
클래스 안에는 각각의 인덱스와, 값을 저장할 변수가 있어야 합니다.
큐에 모든 숫자를 넣고, front보다 가장 큰 수가 있다면 front는 맨 뒤에 가야합니다.
만약 front와 가장 큰 수가 일치하면 pop 합니다.
찾으려는 인덱스와 front의 인덱스가 일치하고, front가 가장 큰 수이면 이제 원하는 숫자가 밖으로 나갈 차례 입니다.
소스 코드 :
문제 링크 : https://www.acmicpc.net/problem/1966
큐의 특성인 FIFO는 모두 알고 있습니다. 이 문제는 원하는 인덱스의 숫자를 몇번째에
출력해 낼 수 있느냐를 묻고 있습니다.
문자열을 출력하는 조건은 큐에 출력하려는 문자보다 큰 숫자가 있으면 큰 숫자먼저 출력하고, 출력하려는 인덱스의 숫자가 가장 크고 가장 앞에 있을 때 출력이 가능합니다.
이를 위해서 큐의 자료형을 클래스 선언 합니다.
클래스 안에는 각각의 인덱스와, 값을 저장할 변수가 있어야 합니다.
큐에 모든 숫자를 넣고, front보다 가장 큰 수가 있다면 front는 맨 뒤에 가야합니다.
만약 front와 가장 큰 수가 일치하면 pop 합니다.
찾으려는 인덱스와 front의 인덱스가 일치하고, front가 가장 큰 수이면 이제 원하는 숫자가 밖으로 나갈 차례 입니다.
소스 코드 :
#include#include #include #include using namespace std; // pair 기능을 할 printer 클래스 선언 class printer { public: int index, value; printer(int a = 0, int b = 0) : index(a), value(b) {}; }; int main() { int t; cin >> t; cin.ignore(); while (t--) { int a, b; queue q; vector v; cin >> a >> b; cin.ignore(); // 큐와 벡터에 값 입력 받음. for (int i = 0; i < a; i++) { int num; cin >> num; cin.ignore(); q.push(printer(i,num)); v.push_back(num); } // 벡터를 오름차순으로 정렬 sort(v.begin(), v.end()); int checker = 1; int cnt = 1; int vsize = v.size(); while (1) { // 찾으려는 인덱스와 front의 인덱스가 일치하고, front가 가장 큰 수이면 if (b == q.front().index && v[vsize - checker] == q.front().value) { break; } // 큐의 front보다 우선순위가 높은수가 벡터에 존재하면 front를 맨 뒤로 보냄 else if (v[vsize - checker] > q.front().value) { printer tmp = printer(q.front().index, q.front().value); q.pop(); q.push(tmp); } // 찾으려는 인덱스는 아니지만 가장큰 수와 front가 같으면 else if(v[vsize - checker] == q.front().value){ checker++; cnt++; q.pop(); } } cout << cnt << endl; } }
댓글
댓글 쓰기