본문 바로가기
Preparing Coding Test/Programmers L2

[Java/프로그래머스] 프린터

by weero 2020. 8. 12.

문제

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

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린��

programmers.co.kr

 

 

시행착오

import java.util.*;

class Solution {
    public void shiftElements(int[] priorities){
        int temp = priorities[0];
        for(int i=1; i<priorities.length; i++){
            priorities[i-1] = priorities[i];
        }
        priorities[priorities.length-1] = temp;
    }
    
    public int solution(int[] priorities, int location) {
        int answer = location;
                
        int idx=0;
        while(true){
            //뒤에 큰게 있는지 검사
            boolean maxFlag = true;
            int j = priorities[idx];
            for(int i=idx; i<priorities.length ; i++){
                if(Math.max(j,priorities[i])!=j){
                    maxFlag = false;
                    shiftElements(priorities);
                    if(answer==0)
                        answer=priorities.length-1;
                    else
                        answer--;
                    break;
                }
                
            }
            
            if(maxFlag == true){
                idx++;
                if(idx==priorities.length)
                    break;
            }
        }
        
        return answer+1;
    }
}

Queue조차 쓰지 않은 코드지만 왜 틀렸을까ㅠ

추가한 테스트케이스까지 맞췄지만 정작 코드채점 결과는 20.0이다. (테스트케이스 1, 5, 9, 14만 통과)

priorities[int[]] location return
[2, 2, 2, 1, 3, 4] 3 6

 

 

풀이

Linkedlist로 documents를 구현했다.

documents의 가장 앞 문서의 우선순위가 가장 높을 때까지 삽입과 삭제를 반복한다.

나머지에 더 중요한 문서가 없으면 인쇄한다.

   이 때 documents의 firstDoc의 idx가 location과 같지 않으면 firstDoc을 빼고 answer을 하나씩 더한다.

 

 

 

코드

import java.util.LinkedList;

class DocNode{
    int idx;
    int priority;
    public DocNode(int idx, int priority){
        this.idx = idx;
        this.priority = priority;
    }
}

class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 1;
        LinkedList<DocNode> documents = new LinkedList<>();
        
        for(int i=0; i<priorities.length ; i++){
            documents.add(new DocNode(i, priorities[i]));
        }
        
        while(documents.size()>1){
            DocNode firstDoc = documents.getFirst();
            
            for(int i=1; i<documents.size(); i++){
                if(firstDoc.priority < documents.get(i).priority){
                    documents.addLast(firstDoc);
                    documents.removeFirst();
                    break;
                }
                
                if(i==documents.size()-1){
                    if(firstDoc.idx==location)
                        return answer;
                    else{
                        documents.removeFirst();
                        answer++;
                    }
                }
            }
        }
        
        return answer;
    }
}

참고 : https://developerdk.tistory.com/15