출처
https://school.programmers.co.kr/learn/courses/30/lessons/42587
조건
1. 인쇄 대기목록의 가장 앞에 있는 문서J를 대기목록에서 꺼냄.
2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 대기목록의 가장 마지막에 넣기.
3. 그렇지 않으면 J를 인쇄.
매개변수
vector<int> priorities : 인쇄 대기목록 배열
int location : 요청한 문서의 현재 대기목록의 위치
추천 해결 방법
- 스택/큐 사용
연구
#1
가장 중요시 했던 점은 대기목록에서 현재 문서보다 우선순위가 높으면 대기목록으로 돌려보낸다는 점이었다. 조건 1을 통해 큐를 사용해야한다는 것은 알았지만, 어떻게 남은 목록에서 대기 순위가 높은 것을 확인하여 돌려보낼 수 있냐는 것이었다. 큐에 대해 알아보던 중 우선 순위 큐에 대해 알게 되었다. cpp STL에서 제공하는 pirority_queue를 찾아보았지만, 같은 우선순위 내에서 순서가 바뀌지 않는 듯 보였다(정확히 읽어보면 다를 수도 있다. 우선순위 큐에 대해 이해가 부족하기 때문). 그래서 priority_queue는 쓰지 않았다.
큐를 우선 순위가 가장 높은 것을 찾기 전까지 나온 문서들을 저장하기 위한 항목으로 사용하고 큐의 top 보다 큰 우선 순위를 가진 문서가 나오면 대기열로 다시 추가하였다. 순서가 자주 변경되는 상황상 location으로 원하는 항목을 특정지을 수 없어 int* 자료형으로 대기 목록과 큐를 구성하게 되었다.
#include
#include
#include
using namespace std;
int solution(vector priorities, int location) {
int answer = 0;
vector arr;
for(int i = 0;i que;
while(true){
if(arr.empty()){
auto data = que.front();
que.pop();
answer++;
if(data == &priorities[location]) return answer;
while(!que.empty()){
data = que.front();
arr.push_back(data);
que.pop();
}
}
if(!que.empty()&&(*(que.front())<*(arr[0]))){
while(!que.empty()){
arr.push_back(que.front());
que.pop();
}
}else{
que.push(arr[0]);
arr.erase(arr.begin());
}
}
}
#2
문제를 해결하고 나니, 우선순위가 가장 큰 것을 기준으로 대기열이 앞 뒤로 나뉜다는 특징이 눈에 띄었다. 배열을 반으로 나눠서 정렬을 하는 것은 알고리즘에서 가장 쉽게 접했던 것이라 배열로 접근하여 해결해보고자 한다.
'개발자로 > 공부' 카테고리의 다른 글
[타임캡슐] 카페 컵 자동 설거지 - (23.09/미완) (0) | 2023.09.13 |
---|---|
Minecraft forge Modding #0001 해결을 위한 여정(2) _ BlockEntity (0) | 2023.07.10 |
Minecraft forge Modding #0001 해결을 위한 여정(1) _ EntityBlock의 상속 계층 (0) | 2023.07.06 |
유클리드 호제법, 최대 공약수 알고리즘 (0) | 2022.08.24 |
[GameEngine] 프로젝트 이름에 대한 경험담 (0) | 2021.11.18 |