프로그래머스 42587 - 프린터
생각과 접근
사족
- 문제 이해를 잘 해야 삽질하지 않는다는 교훈을 얻은 문제.
// 1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다. // 2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다. // 3. 그렇지 않으면 J를 인쇄합니다.
- 처음 잘못 이해했을 때 2번 조건에서 J보다 중요도가 높은 문서가 존재하면, 그 문서를 인쇄하는 것으로 이해해서 삽질을 했다.
본론
queue< pair<int, int> > q;
- 큐를 사용해서 문제를 풀었다.
- 큐를 pair를 이용해서 왼쪽에는 index, 오른쪽에는 priorities[index]를 저장하였다.
- 무한루프
- J에 해당하는 것
q.front()
을 pop한다. (편의상 J라고 부르겠음.) - J를 제외한 큐를 순회해서 J의 우선순위보다 높은 원소를 찾는다.
- 우선순위가 높은 원소가 없다면, J를 인쇄해야 한다.
- 문제의 답은 location에 해당하는 문서의 인쇄 순서를 찾는 것이므로, J의 인덱스와 location이 일치하는지 확인한다.
- 일치한다면, 답을 찾은 것이므로
return answer;
- 일치하지 않는다면, 아무것도 하지 않는다. (이미 J는 pop 되었기 때문에 추가적인 작업이 필요하지 않는다.)
- 일치한다면, 답을 찾은 것이므로
- 문제의 답은 location에 해당하는 문서의 인쇄 순서를 찾는 것이므로, J의 인덱스와 location이 일치하는지 확인한다.
- 우선순위가 높은 원소가 있다면, J를 큐의 가장 마지막에 넣어야 한다.
- 우선순위가 높은 원소가 있다는 것을 flag에 저장하였음
- 큐 순회가 끝나고 나면 J를 push한다.
- 우선순위가 높은 원소가 없다면, J를 인쇄해야 한다.
- J에 해당하는 것
코드
#include <bits/stdc++.h>
using namespace std;
int solution(vector<int> priorities, int location) {
int answer = 0;
queue< pair<int, int> > q;
for(int i = 0; i < priorities.size(); i++){
q.push(make_pair(i, priorities[i]));
}
while(-1){
bool flag = true;
int idx = q.front().first;
int pri = q.front().second;
q.pop();
int size = q.size();
for(int i = 0; i < size; i++){
int _idx = q.front().first;
int _pri = q.front().second;
q.pop();
if(pri < _pri){
flag = false;
}
q.push(make_pair(_idx, _pri));
}
if(flag == false){
q.push(make_pair(idx, pri));
}
else{
answer++;
if(idx == location){
return answer;
}
}
}
}
채점 결과
'Coding Test > programmers' 카테고리의 다른 글
프로그래머스 42746 - 가장 큰 수 (c++) (0) | 2020.07.29 |
---|---|
프로그래머스 42748 - K번째수 (c++) (0) | 2020.07.29 |
프로그래머스 42583 - 다리를 지나는 트럭 (c++) (0) | 2020.07.28 |
프로그래머스 42586 - 기능개발 (c++) (0) | 2020.07.28 |
프로그래머스 42584 - 주식가격 (c++) (0) | 2020.07.28 |