프린터(java)

최준근·2022년 4월 14일
0

java알고리즘

목록 보기
57/63

문제설명

생각하기

  1. ArrayList를 활용
  2. 문서(J)를 꺼내기
  3. 남은 서류들 중 우선순위가 높은 서류를 찾기
  4. (J)의 우선순위가 가장 높다면 ans++
  5. location이 0이고, J의 우선순위가 가장높다면 return

내 풀이

import java.util.ArrayList;
class Solution {
    public int solution(int[] priorities, int location) {
        int ans = 0;
        int J = 0;
        ArrayList<Integer> list = new ArrayList<>();
        
        for(int i : priorities ) list.add(i);
    
        for(int i=0; i<5050; i++){
            
            J = list.get(0);
            list.remove(0);
            int jmax = J;
            
            for(int j=0; j<list.size(); j++){
                jmax = Math.max(jmax,list.get(j));
                
                if(J < list.get(j)) {
                    if(location !=0) location--;
                    else if(location ==0) location = list.size();
                    list.add(J);
                    break;
                }
            }
           
            if( jmax == J && location !=0){
                location--;
                ans++;
            }else if( jmax == J && location ==0){ 
                ans++;
                break;
            }
        }
        return ans;
    }
}

두번째 for문에서 최악의 반복횟수를 생각하여 100!(팩토리얼)인 5050번 반복해준다.
J(문서)를 꺼낸 뒤 리스트에서 삭제해준다.
가장높은 우선순위를 jmax에 넣어주고 반복문이 끝났을 때 J와 비교해준다.
break문을 적절히 사용하여 최대반복 횟수인 5050을 채우지 않고 효율적인 속도를 낼 수 있다.
입출력 예 2번을 보면 location 0에 있는 1이 인쇄되는 순서를 찾아야 하는데 문제는 대기목록에 1이 중복되어 있기 때문에 두개의 if조건문을 사용하여 걸러준다.

if( jmax == J && location !=0){
                location--;
                ans++;
}else if( jmax == J && location ==0){ 
                ans++;
                break;
profile
느려도 좋으니 꾸준하게

0개의 댓글