Java

프로그래머스: 프린터

openDeveloper 2023. 3. 18. 03:53

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 풀이 접근법 :  과제 조건(LinkedList를 꼭 사용해야한다는 전제 조건)이 있어, LinkedList 안에 우선 순위와 위치를 넣어

가장 앞에 있는 프린트물이 List 내에서 우선 순위가 최대일 때 List 내에서 꺼내고, 꺼낸 값이 원하는 location 일때 list 내에 꺼낸 순서를 출력한다.

 

import java.util.*;
class Solution {
        public int solution(int[] priorities, int location) {

        int answer = 1;
        int idx = 0;
        LinkedList<Node> list = new LinkedList<>();
        int maxPriority = Integer.MIN_VALUE;

        for (int priority : priorities) {
            list.offer(new Node(priority, idx++));
            maxPriority = Math.max(maxPriority, priority);
        }


        while (!list.isEmpty()) {
            Node cur = list.poll();
            if (cur.priority < maxPriority) {
                list.offerLast(cur);
                System.out.println(1);
            }else{
                maxPriority = -1;
                if (cur.location == location) {
                    return answer;
                }else{
                    answer++;
                }
                for (Node num : list) {
                    maxPriority = Math.max(maxPriority, num.priority);
                }
            }

        }

        return -1;
    }

    class Node {
        int location;
        int priority;

        public Node (int priority, int location){
            this.location = location;
            this.priority = priority;
        }
    }
}

LinkedList 내에는 하나의 데이터 타입으로 넣을 수 있어, Class Node를 선언해 우선 순위와 위치를 한번에 넣어주었다.

 

다른 사람의 답안 풀이를 보니, list를 큐로 구현하고 기존에 받은 우선순위 배열을 정렬하여 가장 끝에 있는 값이랑 프린트에서 제거할 우선 순위와 같으면 list에서 삭제하고, 같지 않으면 list에 가장 마지막에 넣으면서 원하는 location이 아니면 list에서 꺼낼 때 location의 값을 감소시키면서 최종적으로 값을 구함 (투포인트와 느낌이 비슷함, 아래 코드)

 

import java.util.*;

class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0;
        int l = location;

        Queue<Integer> que = new LinkedList<Integer>();
        for(int i : priorities){
            que.add(i);
        }

        Arrays.sort(priorities);
        int size = priorities.length-1;



        while(!que.isEmpty()){
            Integer i = que.poll();
            if(i == priorities[size - answer]){
                answer++;
                l--;
                if(l <0)
                    break;
            }else{
                que.add(i);
                l--;
                if(l<0)
                    l=que.size()-1;
            }
        }

        return answer;
    }
}