프로그래머스 알고리즘 문제 풀이 스택 & 큐

zio도미닉·2022년 1월 6일
0

기능개발

JAVA Queue 선언

Queue<Integer>queue=new LinkedList<>();
  • 해결방법
    1. Modular를 이용하여 주어진 값 찾기
    2. 자료구조는 Queue를 사용해서 하나씩 빼고 다음 수와 비교
    public int[] solution(int[] progresses, int[] speeds) {
 
        // 큐 생성
        Queue<Integer> queue=new LinkedList<>();
        for (int i=0;i<progresses.length;i++) {
            int val=100-progresses[i];
            
            int mod=val%speeds[i];
            int res=val/speeds[i];
            // System.out.println(mod);
            // System.out.println(res);
            if (mod>0) {
                progresses[i]=res+1;
            }
            else {
                   progresses[i]=res;
            }
            queue.add(progresses[i]);
        }
        
        // System.out.println(Arrays.toString(progresses));
        // System.out.println(queue.toString());
        
        ArrayList<Integer>arrayList=new ArrayList<>();
        while (!queue.isEmpty()) {
            int res=queue.poll();
            int time=1;
            
            while (!queue.isEmpty()) {
                int next=queue.peek();
                if (res>=next) {
                    queue.poll();
                    time++;
                }
                else {
                    break;
                }
            }
            arrayList.add(time);
            
        }
        
        // System.out.println(arrayList.toString());
        int[] answer =new int[arrayList.size()];
        for (int i=0;i<arrayList.size();i++) {
            answer[i]=arrayList.get(i);
        }
   
        return answer;
    }

프린터

해결방법

  • 가장 앞에 있는 문서(J)를 뽑는다. -> 앞부터 순서대로 가기 때문에 Queue자료 구조를 사용하자는 것을 인식하자
  • Queue에 들어가서 확인되어야 값은 2개의 인자이기 때문에 class로 만들어서 따로 분리하자
Queue<Printer> queue=new LinkedList<>();
static class Printer{
	int idx;
    	int prioirty;
        Printer(int idx, int priority) {
            this.idx;
            this.priority;
        }
}
  • 처음에 실패 -> 이유는 Queue에서 다음 값을 검증할때 그 큐도 while(!isEmpty())로 검증하여 실패 -> 따라서 1번만 검증하는 for Each로 변경하여 문제 풀이
    static class Printer{
        int idx;
        int priority;

        Printer(int idx, int priority) {
            this.idx=idx;
            this.priority=priority;
        }
    }
    
    public int solution(int[] priorities, int location) {
        int answer = 0;
        Queue<Printer> queue=new LinkedList<>();
        for (int i=0;i<priorities.length;i++) {
            
            Printer printer=new Printer(i,priorities[i]);
            queue.add(printer);
            
        }
        
        // System.out.println(queue.toString());
        
        int time=1;
        while (!queue.isEmpty()) {
            Printer printer=queue.poll();
            int idx=printer.idx;
            int first_priority=printer.priority;
            boolean check=true;
            
            
            // 1번 문제 -> Queue가 무한히 돌면 안됨
//             while (!queue.isEmpty()) {
//                 Printer next_printer=queue.peek();
//                 int next_priority=next_printer.priority;
//                 int next_idx=next_printer.idx;
                
//                 // 큰게 존재
//                 if (first_priority<next_priority) {
//                     queue.add(new Printer(idx,first_priority));
//                     check=false;
//                     break;
//                 }
                
//                 // else {
//                 //     if (idx==location) {
//                 //         return time;
//                 //     }
//                 //     time++;
//                 // }
//             }
            
            // -> for Each로 수정 (1번만 돌게 만든다)
            for (Printer nextPrinter:queue) {
                int next_priority=nextPrinter.priority;
                int next_idx=nextPrinter.idx;
                
                if (first_priority<next_priority) {
                    queue.add(new Printer(idx,first_priority));
                    check=false;
                    break;
                }
                
            }
            
            // 다 돌았는데 큰게 없으면 뽑느다. 
            if (check) {
                if (idx==location) {
                        return time;
                    }
                time++;
            }
            
        }
        return answer;
    }

다리를 지나는 트럭

profile
BackEnd Developer

0개의 댓글