SZCODE 2020. 5. 5. 19:07

https://programmers.co.kr/learn/courses/30/lessons/42587

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

목표 : 중요도가 순서대로 담긴 배열 priorities와 위치 location이 있을 때, 요청한 문서가 몇 번째로 인쇄되는 지 구하기

조건 : 

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

 

프린터 대기목록에 중요도가 높은 문서를 먼저 인쇄하는 문제

큐 활용, Pair클래스는 배열의 위치와 값을 저장하기 위해 사용

먼저 priorities 배열에 위치와 값을 큐에 저장 

1. 중요도가 가장 큰 숫자부터 인쇄하기 위해 먼저 배열을 정렬한다.

2. 반복문으로 배열의 맨 끝의(가장 큰 숫자) 값과 큐에서 뺀 값이 같은지 비교한다.

2-1. 비교한 숫자가 다르면 큐의 끝에 넣는다.

2-2. 비교한 숫자가 같으면 위치를 확인해준다.

      위치가 같으면 횟수를 세주고 for문을 끝낸다.

      위치가 다르면 횟수를 세주고 while문을 끝낸다. 다시 for문으로 돌아가서 다음 대기열을 확인한다.

 

주의 : 배열을 정렬해서 큐와 비교하는데 활용하기

        for문이 차례로 돌기 위해 while문을 안에 넣어준다. 

        break를 제대로 활용하기

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

class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0;
		Queue<Pair> q = new LinkedList<>();
		for (int i = 0; i < priorities.length; i++) {
			q.offer(new Pair(i, priorities[i]));
		}

		Arrays.sort(priorities);// 정렬
		
		out: for (int i = priorities.length - 1; i >= 0; i--) {
			while (true) {
				Pair p = q.poll();// 큐에서 빼기
				if (priorities[i] != p.value) {// 큐에서 뺀 값이 배열의 끝과 다르면
					q.offer(p);// 큐에 다시 넣기

				} else {//같으면
					if (location == p.index) {//위치 확인
						answer++;// 횟수세기
						break out;
					} else {// 다르면
						answer++;
						break;
					}
				}
			}
		}
		return answer;
    }
}
class Pair {
	int index;
	int value;

	Pair(int index, int value) {
		this.index = index;
		this.value = value;
	}
}