본문 바로가기

algorithm

[프로그래머스]프린터

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

 

코딩테스트 연습 - 프린터 | 프로그래머스

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다. 1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다. 2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에

programmers.co.kr

문제설명

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