https://programmers.co.kr/learn/courses/30/lessons/42587
문제설명
1. 인쇄 대기목록의 갖아 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
3. 그렇지 않으면 J를 인쇄합니다.
입출력 예
priorties location return
[2, 1, 3, 2] 2 1
[1, 1, 9, 1, 1, 1] 0 5
풀이
처음에는 port = priorties를 사용해서 값을 넘겨 주었는데, sort를 하니 priorities, port 둘 다 값이 정렬 되었다.
아마 값에 의한 호출(?) 때문인 거 같다. 그래서 for문을 통해 값을 넘겨 주었다.
for (int l = 0; l < len; l++) {
port[l] = priorities[l];
}
port 값을 오름차순을 한 이유는 priiorities에서 제일 큰 값을 찾기 위해서이다.
lenTemp의 값을 len -1 을 해준 이유는 배열의 값은 N - 1 까지 있기 때문이다.
Arrays.sort(port);
temp = port[lenTep];
priorities의 값을 하나 씩 큐에 넣어 준다.
for(i = 0; i < len; i++) {
qu.add(priorities[i]);
}
qu.poll()을 통해 먼저 들어 간 값을 빼너어 temp1에 대입하고
temp(priorities의 배열에 있는 최대 값)과 비교 해준다. 만약 최대 값 보다 작으면
qu.add를 통해 빼내었던 값을 다시 넣어준다..
location(내가 인쇄를 요청한 문서의 위치)의 값도 location-- 한칸 땡기고 location이 0이면 맨 뒤로 가기에
location = len을 해주었다.
만약 temp1이 최대 값이면, count(인쇄가 출력이 되는 순서)의 값을 올려준다.
temp1 값이 locTemp(내가 인쇄를 요청한 문서의 값, 또한 &&을 통해 location을 위치도 0 인것을 파악해야 한다.
왜냐하면 location의 값이 0 즉, 맨 앞에 있어야지 큐를 통해 뺄 수 있기 때문이다.)이면 answer을 리턴해서
내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는 알 수 있다.
while(true) {
temp1 = qu.poll();
if (temp > temp1) {
qu.add(temp1);
location--;
if(location == 0) {
location = len;
}
} else {
location--;
count++;
if(temp1 == locTemp && location == 0) {
answer = count;
break;
}
len -= 1;
lenTep--;
temp = port[lenTep];
}
}
큐의 개념에 대해서 알 수 있었던 문제였다. 큐(먼저 들어 온 것이 먼저 나간다. FIFO)
import java.util.LinkedList;
import java.util.Queue;
import java.util.Arrays;
class Solution {
public int solution(int[] priorities, int location) {
int i = 0, temp = 0 , j = 0, temp1 = 0, answer = 0, count = 0;
location += 1;
int len = priorities.length, lenTep = len - 1, locTemp = priorities[location - 1];
int[] port = new int[len];
for (int l = 0; l < len; l++) {
port[l] = priorities[l];
}
Arrays.sort(port);
temp = port[lenTep];
Queue<Integer> qu = new LinkedList<Integer>();
for(i = 0; i < len; i++) {
qu.add(priorities[i]);
}
while(true) {
temp1 = qu.poll();
if (temp > temp1) {
qu.add(temp1);
location--;
if(location == 0) {
location = len;
}
} else {
location--;
count++;
if(temp1 == locTemp && location == 0) {
answer = count;
break;
}
len -= 1;
lenTep--;
temp = port[lenTep];
}
}
return answer;
}
}
'algorithm' 카테고리의 다른 글
[프로그래머스]멀쩡한 사각형 (0) | 2020.03.01 |
---|---|
[프로그래머스]기능개발 (0) | 2020.01.12 |
[프로그래머스]위장 (0) | 2020.01.08 |
[프로그래머스][1차]비밀지도 (0) | 2019.12.23 |
[프로그래머스][1차]다트게임 (0) | 2019.12.22 |