[프로그래머스] 프린터 (java) Queue

2020-01-07

프린터 (programers > lev2 > Stack_Queue)

package Stack_Queue;

import java.util.*;

public class prog_2_프린터 {

    static public int solution(int[] priorities, int location) {
        int answer = 0;

        //Queue는 내부를 다 훑어보지 못하므로 LinkedList 사용
        LinkedList<Integer> index = new LinkedList<Integer>(); //index
        LinkedList<Integer> prio = new LinkedList<Integer>(); // 중요도
        boolean check = false;

        for(int i=0;i<priorities.length;i++) {
        	index.add(i);
        	prio.add(priorities[i]);
        }

        while(true) {
        	for(int i=1;i<prio.size();i++) {//맨앞과, 나머지 비교
        		if(prio.get(0)<prio.get(i)) {
        			//맨앞보다 중요도 높은 것들이 있다면 제거해서 뒤로 보내준다
        			int rem_idx = index.remove(0);
        			index.add(rem_idx);

        			int rem_prio = prio.remove(0);
        			prio.add(rem_prio);

        			check= true;
        		}
        	}

        	if(check == false) { //나보다 큰애가 없다는거
        		if(index.get(0) == location) {
        			answer++;
        			break;
        		}

        		else {
        			index.remove(0);
        			prio.remove(0);
        			answer++;
        		}
        	}

        	check=false; // 빼먹지 않도록 주의한다! 자칫하면 무한루프 돌 수 있음
        }


        return answer;
    }

	public static void main(String[] args) {
		int arr[] = {2,1,3,2};
		System.out.println(solution(arr,2));
	}
}

  • 마지막에 check=false;를 빼먹어서 무한루프 돌았다. 빼먹지 않도록! (30min)


+1/8

    class Attribute{
    	int index;
    	int prio;
    	
    	Attribute(int index, int prio){
    		this.index = index;
    		this.prio = prio;
    	}

    }
    
    public int sol(int[] priorities, int location) {
    	int answer = 0;
    	
    	LinkedList<Attribute> att = new LinkedList<Attribute>();
    	boolean check = false;
    	
    	for(int i=0;i<priorities.length;i++)
    		att.add(new Attribute(i, priorities[i]));
 
    	while(true) {
    		for(int i=1;i<att.size();i++) {
    			if(att.get(0).prio < att.get(i).prio) {
    				check = true;
    				Attribute back = att.remove();
    				att.add(back);
    				break;
    			}
    		}//for
    		
    		if(check == false) {
    			answer++;
    			
    			if(att.get(0).index == location)
    				break;
    			
    			att.remove();
    		}
    		else
    			check = false;
    	}
    	
    	return answer;
    }

+동시에 list두 개를 움직이는게 보기 좋지 않아서 class를 만들어서 list에 담았다. 그나마 쪼끔 깔끔해졌다!