티스토리 뷰
반응형
프린터큐
☞ 문제링크
Document를 클래스로 선언해야겠다는 생각만 했다면, 나머지는 큐의 기능을 문제 그대로 구현만 하면 되는 문제 였습니다.
문제 풀이 전략 (java)
- Document(문서) 클래스를 선언한다.
- Document는 필드값으로 sequence(순서)와 importance(중요도)를 갖는다.
- 입력값을 기준으로 Document 인스턴스들이 담겨있는 큐를 정의한다.
- 큐(queue)에서 peek한 Document의 importance(중요도) 값보다 더 큰 importance(중요도)가 있다면, 큐의 맨 뒤로 보낸다.
- 큐(queue)에서 peek한 Document의 importance(중요도) 값보다 더 큰 importance(중요도)가 없다면, 큐에서 제거한다.
- 4,5번 과정을 반복하다가, 5번에 해당하는 Document의 sequence(순서)가 M과 다르다면 result(출력순서)를 하나 증가시킨다.
- 4,5번 과정을 반복하다가, 5번에 해당하는 Document의 sequence(순서)가 M과 같다면 result(출력순서)를 반환한다.
class Document {
}
class Document {
private int sequence;
private int importance;
}
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]));
}
. . .
}
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;
}
. . . documentQueue.poll() . . .
if (checkImportance(documentQueue)) {
if (documentQueue.poll().getSequence() == M) {
return result;
} else {
result++;
}
}
if (checkImportance(documentQueue)) {
if (documentQueue.poll().getSequence() == M) {
return result;
} else {
result++;
}
}
배운점
- 문제가 쉽다고 느껴지는 순간, 빨리 풀어야겠다는 생각에 조급한 마음이 생겼는데 꼼꼼히 문제와 입력값 출력값을 확인해서 문제에 대한 이해를 높일 수 있었다.
- 각 자료 인덱스들의 순서가 바뀔 수 있는 경우 '여러개의 배열을 이용하기 보다는 클래스(인스턴스)의 필드로 선언해두는 것이 좋을 것 같다'라고 기준을 정해두었는데, 그 기준으로 문제가 바로 풀린 것 같아 기분이 좋았다.
- 여담으로 백준 알고리즘의 입력값은 그냥 sc.nextint() 만으로도 가능했다. (굳이 nextLine으로 받고 split하는 뻘짓을 하지말자.)
반응형
'Algorithm' 카테고리의 다른 글
프로그래머스 알고리즘 - 단어변환 (0) | 2019.01.04 |
---|---|
순열(permutation) 알고리즘 (2) | 2019.01.03 |
프로그래머스 알고리즘 - 네트워크 (0) | 2018.12.29 |
그래프(Graph) DFS 탐색 구현하기 (0) | 2018.12.27 |
그래프(Graph) 인접 리스트(adjacency list)로 구현하기 (0) | 2018.12.26 |
댓글