[프로그래머스] 프린터 (JAVA/자바)

·2021년 7월 19일
0

Algorithm

목록 보기
22/60

문제

프로그래머스>코딩테스트 연습>고득점 Kit>스택/큐 : 프린터 - https://programmers.co.kr/learn/courses/30/lessons/42587


풀이

문제 그대로 이해해서 코드로 적용하면 되는 문제.

1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
3. 그렇지 않으면 J를 인쇄합니다.
  1. input으로 들어오는 priorities를 locations과 묶어 Task로 정의했다. 이 Task는 순서대로 Queue에 넣는다.

  2. Queue에서 가장 앞에 위치한 Task를 뽑아낸 뒤, 큐에 남아있는 Task를 확인해 방금 뽑은 Task보다 더 높은 우선순위를 가진 작업이 존재하는지 확인한다.

    • 더 높은 우선순위의 작업이 큐에 존재하면 다시 큐에 넣는다.(큐를 사용하기 때문에 맨 뒤로 들어간다)
    • 뽑은 Task가 가장 큰 우선순위라면 다시 큐에 넣지 않고 인쇄하는데, 찾던 요청이면 순서를 출력하고 종료한다!

코드

import java.util.LinkedList;
import java.util.Queue;

public class Solution {
    class Task{
        int location;
        int priority;
        public Task(int location, int priority) {
            this.location = location;
            this.priority = priority;
        }
    }
    public int solution(int[] priorities, int location) {
        int answer = 0;

        Queue<Task> queue = new LinkedList<>();

        for(int i=0; i<priorities.length; i++){
            queue.add(new Task(i, priorities[i]));
        }

        int now=0;
        while(!queue.isEmpty()){
            Task cur = queue.poll();
            boolean flag = false;
            for(Task t : queue){
                if(t.priority>cur.priority){
                    flag = true;
                }
            }
            if(flag) { // 우선순위 높은게 있으면 뒤로 보낸다
                queue.add(cur);
            }else{
                now++;
                if(cur.location == location) {
                    answer = now;
                    break;
                }

            }
        }
        return answer;
    }
}

정리

✔ 알고리즘 분류 - 스택/큐
✔ 난이도 - Level 2

🤦‍♀️ 메모

  • 아래와 같이, Queue 안의 객체들을 for문으로 확인할 수 있다.
for(Task t : queue){
	...
}
  • location과 priority를 같이 봐야하기 때문에 따로 Task라는 class를 만들어 풀이했다!

참고 사이트

딱히 없음

profile
당근먹고 자라나는 개발자

0개의 댓글