일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 파일시스템 구현
- 알고리즘
- 그리디 알고리즘
- OS
- 영속성
- 타입 객체
- 자료구조
- I/O장치
- Direct12
- DirectX12
- 디자인패턴
- directx
- codility
- 운영체제
- 렌더링 파이프라인
- 멀티쓰레드
- 그리디알고리즘
- 멀티프로세서
- 다이나믹프로그래밍
- 쓰레드
- 백준
- 병행성 관련 오류
- 병행성
- DirectX 12
- 동적계획법
- 다이나믹 프로그래밍
- 스케줄링
- 프로그래머스
- 락
- 컨디션 변수
Archives
- Today
- Total
기록공간
프린터 (프로그래머스) 본문
반응형
대기목록의 문서들을 순서대로 담을 큐와 가장 중요도가 높은 문서를 알 수 있도록 해주는 최대 힙이 필요한 문제였다.
풀이과정을 정리해보면 다음과 같다.
-
문서 순서와 중요도를 기록할 큐 q와 중요도가 큰 순서대로 보여줄 최대 힙 pq를 선언한다.
-
주어진 priorities 정보를 q와 pq에 담는다.
-
q의 값을 꺼내 pq top에 있는 값과 비교한다. 만약 같다면 pq를 pop 한다. (문서 순서가 location과 같으면 요청한 문서이므로 알고리즘을 종료한다.)
-
만약 다르다면 q에서 꺼낸 값을 다시 집어넣는다.
-
3, 4 작업을 q가 빌 때까지 반복한다.
-
5번 작업이 끝난 후 pq가 pop 한 횟수가 구하는 값이 된다.
코드는 다음과 같다.
#include <vector>
#include <queue>
using namespace std;
int solution(vector<int> priorities, int location) {
int answer = 0;
// 정보를 담을 큐
queue<pair<int, int>> process;
// 중요도를 중요순위대로 담을 최대 힙
priority_queue<int, vector<int>, less<int>> pq;
// priorities의 정보를 큐와 힙에 넣는다.
for(int i = 0; i < priorities.size(); ++i)
{
process.push(make_pair(i, priorities[i]));
pq.push(priorities[i]);
}
// 큐가 빌때까지
while(!process.empty())
{
// 큐에서 정보를 하나 꺼낸다.
pair<int, int> info = process.front();
process.pop();
// 최대 중요순위가 같다면
if(info.second == pq.top())
{
// 출력되는 것이므로 answer를 하나 증가시킨다.
pq.pop();
++answer;
// 만약 출력하려고 하는 문서라면 루프를 빠져나온다.
if(info.first == location) break;
}
// 최대 중요 순위가 아니면
// 다시 큐에 넣는다.
else process.push(info);
}
return answer;
}
반응형
'Algorithm > 문제' 카테고리의 다른 글
가장 큰 정사각형 찾기 (프로그래머스) (0) | 2020.06.10 |
---|---|
숫자 야구 (프로그래머스) (0) | 2020.06.09 |
주식가격 (프로그래머스) (0) | 2020.06.05 |
더 맵게 (프로그래머스) (0) | 2020.06.05 |
괄호변환 (프로그래머스) (0) | 2020.06.05 |
Comments