알고리즘 공부

[프로그래머스] 프린터 - java

철매존 2021. 5. 2. 17:59
728x90
반응형

문제 설명

1. 프린트 뽑는 순서와 중요도가 정해져 있다.

2. 프린트를 순서대로 가져오는데, 현재 뽑을 예정인 순서의 프린트보다 중요도가 높은 것이 있으면 현재 순서의 프린트를 맨 뒤로 보내준다.

3. 중요도는 1~9로 존재하며 숫자가 클수록 중요하다.

4. location에 해당하는 프린트가 몇 번째로 뽑히는지 찾아 return하면 된다.

 

 

 

풀이 과정

 1. queue에 넣어두고 하나씩 빼서 비교해 준다.

 2. queue내에 현재 peek값보다 큰 중요도를 갖는 것이 있으면 현재 peek를 빼서 다시 넣으면 최후미로 이동할 것이다.

 3. 해당 process를 계속 진행하면서 프린트가 뽑힐 때 마다 location을 하나씩 빼면서 진행해 주고, location이 0이고, 현재 값이 출력된 경우가 답이 된다.

 4. 만약 location은 0이라면 현재 위치가 구해야 하는 위치인데, 이것이 다시 맨 뒤로 이동하는 경우, 진행해야 하는 process를 구해서 더해 준다.

 5. 전체 process의 진행동안 answer을 1씩 추가하여, 마지막 location이 출력되는 경우가 정답이 된다.

 

코드

import java.util.*;
class Solution {
public int solution(int[] priorities, int location) {
int answer = 0;
// 프린트는 First in, First out 방식을 사용하기 때문에 queue를 활용한다.
Queue<Integer> waiting = new LinkedList<>();
// 먼저 queue waitng에 순서대로 값을 넣어준다.
for(int i=0; i<priorities.length; i++)
waiting.offer(priorities[i]);
// 모든 기다리는 print가 완료되기 전까지 코드를 수행한다.
while(!waiting.isEmpty())
{
// 더 중요한 프린트가 있을 경우 ture, 아닌 경우 false.
boolean importance = false;
// queue의 모든 값들과 현재 peek값을 비교하여 중요도가 높은 것이 있는 경우 ture로 설정한다.
for(int i : waiting)
{
if(i>waiting.peek())
importance = true;
}
// 현재 값이 최우선이 아닌 경우
if(importance)
{
// 현재 값을 rear로 보낸 후, 삭제한다.
waiting.offer(waiting.peek());
waiting.remove();
// 그리고 현재 존재하는 위치가 알고 싶은 프린트 번호라면, 맨 뒤로 가기 때문에 현재 queue의 크기만큼 앞에 수행해야 할 작업이 존재한다.
if(location==0)
location += waiting.size();
}
// 현재 값이 최우선인 경우.
else
{
// 값을 빼내 준다.
waiting.poll();
// 그리고 그 값이 빠진 만큼 작업이 행해지기 때문에 answer을 더해준다.
answer++;
// 만약 지금 나간 값이 원하는 작업의 위치라면 while문을 나가면 된다.
if(location == 0)
break;
}
// 매 작업이 행해질 때 마다 location의 위치는 한 칸씩 peek로 이동하게 된다.
location--;
}
return answer;
}
}
view raw 프린터 hosted with ❤ by GitHub
반응형