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

2022. 3. 13. 18:48프로그래머스

 

문제 링크
코딩테스트 연습 - 프린터 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

 

1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
3. 그렇지 않으면 J를 인쇄합니다.

문제 설명에서부터 Queue 를 사용해야 될 것이라는 느낌이 듭니다.

가장 앞에 있는 문서를 꺼내고, 중요도가 가장 높은게 아니라면 뒤에 push 합니다.

 

자바에서 Queue 는 LinkedList 로 구현합니다.

 

인자로 int 배열 priorities, 찾으려는 위치인 location 이 넘겨집니다.

큐에 인덱스 값 0 ~ (i-1) 을 넣고 앞에서부터 꺼내는데, priorities 배열의 모든 원소들과 값을 비교하면서 크기가 더 큰 값이 하나라도 존재라면 값을 빼서 맨 뒤로 넣어줍니다. 

 

이미 뺀 값의 인덱스는 priorities에서 그 인덱스의 값을 0 으로 지정해줍니다.

 

 

소스코드

public int solution(int[] priorities, int location) {
    int answer = 0;
    ArrayList<Integer> list = new ArrayList<>();
    Queue<Integer> q= new LinkedList<>();
    int length = priorities.length;
    for(int i=0;i<length;i++){
        q.add(i); // 큐에 인덱스값 삽입
    }

    while(!q.isEmpty()){
        boolean flag = false;
        int front = q.peek();
        for(int i=0;i<length;i++){
            if(i==front) continue;
            if(priorities[i] > priorities[front]){
                q.poll();
                q.add(front);
                flag = true;
                break;
            }
        }
        if(!flag) {
            q.poll();
            list.add(front);
            priorities[front] = 0;
        }
    }

    for(int i=0;i<list.size();i++){
        if(list.get(i)==location)
            return i+1;
    }
    return answer;
}