티스토리 뷰

반응형

프린터큐

문제링크

Document를 클래스로 선언해야겠다는 생각만 했다면, 나머지는 큐의 기능을 문제 그대로 구현만 하면 되는 문제 였습니다.

문제 풀이 전략 (java)

  1. Document(문서) 클래스를 선언한다.
  2. class Document {
    }
    
  3. Document는 필드값으로 sequence(순서)와 importance(중요도)를 갖는다.
  4. class Document {
        private int sequence;
        private int importance;
    }
    
  5. 입력값을 기준으로 Document 인스턴스들이 담겨있는 큐를 정의한다.
  6. public static int solution(int N, int M, int[] importance) {
        Queue<Document> documentQueue = new LinkedList<>();
        for (int i = 0; i < importance.length; i++) {
            documentQueue.add(new Document(i, importance[i]));
        }
        . . .
    }
    
  7. 큐(queue)에서 peek한 Document의 importance(중요도) 값보다 더 큰 importance(중요도)가 있다면, 큐의 맨 뒤로 보낸다. 
  8. private static boolean checkImportance(Queue<document> documentQueue) {
        for (int i = 1; i < documentQueue.size(); i++) {
            //픽한 문서가 다른 문서보다 중요도가 낮은 경우 마지막에 넣는다.
            if (documentQueue.peek().getImportance() < ((LinkedList<document>) documentQueue).get(i).getImportance()) {
                documentQueue.add(documentQueue.poll());
                return false;
            }
        }
        return true;
    }
  9. 큐(queue)에서 peek한 Document의 importance(중요도) 값보다 더 큰 importance(중요도)가 없다면, 큐에서 제거한다.
  10.    . . . documentQueue.poll() . . .
  11. 4,5번 과정을 반복하다가, 5번에 해당하는 Document의 sequence(순서)가 M과 다르다면 result(출력순서)를 하나 증가시킨다.
  12. if (checkImportance(documentQueue)) {
        if (documentQueue.poll().getSequence() == M) {
            return result;
        } else {
           result++;
        }
    }
  13. 4,5번 과정을 반복하다가, 5번에 해당하는 Document의 sequence(순서)가 M과 같다면 result(출력순서)를 반환한다.
  14. if (checkImportance(documentQueue)) {
        if (documentQueue.poll().getSequence() == M) {
             return result;
        } else {
          result++;
        }
    }


배운점

  • 문제가 쉽다고 느껴지는 순간, 빨리 풀어야겠다는 생각에 조급한 마음이 생겼는데 꼼꼼히 문제와 입력값 출력값을 확인해서 문제에 대한 이해를 높일 수 있었다.
  • 각 자료 인덱스들의 순서가 바뀔 수 있는 경우 '여러개의 배열을 이용하기 보다는 클래스(인스턴스)의 필드로 선언해두는 것이 좋을 것 같다'라고 기준을 정해두었는데, 그 기준으로 문제가 바로 풀린 것 같아 기분이 좋았다.
  • 여담으로 백준 알고리즘의 입력값은 그냥 sc.nextint() 만으로도 가능했다. (굳이 nextLine으로 받고 split하는 뻘짓을 하지말자.)


반응형
댓글