2021. 9. 25. 00:17ㆍ알고리즘/백준
문제
여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에 쌓여서 FIFO - First In First Out - 에 따라 인쇄가 되게 된다. 하지만 상근이는 새로운 프린터기 내부 소프트웨어를 개발하였는데, 이 프린터기는 다음과 같은 조건에 따라 인쇄를 하게 된다.
- 현재 Queue의 가장 앞에 있는 문서의 ‘중요도’를 확인한다.
- 나머지 문서들 중 현재 문서보다 중요도가 높은 문서가 하나라도 있다면, 이 문서를 인쇄하지 않고 Queue의 가장 뒤에 재배치 한다. 그렇지 않다면 바로 인쇄를 한다.
예를 들어 Queue에 4개의 문서(A B C D)가 있고, 중요도가 2 1 4 3 라면 C를 인쇄하고, 다음으로 D를 인쇄하고 A, B를 인쇄하게 된다.
여러분이 할 일은, 현재 Queue에 있는 문서의 수와 중요도가 주어졌을 때, 어떤 한 문서가 몇 번째로 인쇄되는지 알아내는 것이다. 예를 들어 위의 예에서 C문서는 1번째로, A문서는 3번째로 인쇄되게 된다.
입력
첫 줄에 테스트케이스의 수가 주어진다. 각 테스트케이스는 두 줄로 이루어져 있다.
테스트케이스의 첫 번째 줄에는 문서의 개수 N(1 ≤ N ≤ 100)과, 몇 번째로 인쇄되었는지 궁금한 문서가 현재 Queue에서 몇 번째에 놓여 있는지를 나타내는 정수 M(0 ≤ M < N)이 주어진다. 이때 맨 왼쪽은 0번째라고 하자. 두 번째 줄에는 N개 문서의 중요도가 차례대로 주어진다. 중요도는 1 이상 9 이하의 정수이고, 중요도가 같은 문서가 여러 개 있을 수도 있다.
출력
각 테스트 케이스에 대해 문서가 몇 번째로 인쇄되는지 출력한다.
출처: <https://www.acmicpc.net/problem/1966>
##문제이해##
프로그래머스에서 정말 힘들게 힘들게 풀었던문제와 동일했다 그래서 그때랑 다르게 우선순위 큐를 사용했다.
우선순위 큐를 사용할 경우 우선순위가 높은 순서대로 정렬된 채 입력이 되고(어차피 우선순위가 높은문서부터 출력이된다) 그 먼저 들어온 문서가 내가 원하는 문서인지 체크만 하면된다(location값!)
Index값이 고유한 값처럼 사용가능하게된다!
Ex) 아래와 같은 입력값일때 2번째 수는 3이 된다.(맨 왼쪽은 0번째라고 하자라고 했다)
설령 동일한 값이 존재한다고하면 1 2 3 3 4 라고할때 각각 인덱스 값은 다르게된다.(같은3이라도 location값은 2와3으로 다르다)
4 2
1 2 3 4
##기타##
그런데 제출 시 틀렸다고 나온다 ㅠㅠㅠㅠ
##내코드##
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;
public class boj_1966 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int test = sc.nextInt();
//테스트케이스 수만큼 반복처리
for(int z=0; z<test; z++) {
int N = sc.nextInt();
int location= sc.nextInt();
int priority =0;
//우선순위가 높은 숫자순서로 생성
PriorityQueue<Print> q = new PriorityQueue<>(new Comparator<Print>() {
//우선순위 순서로 정렬
@Override
public int compare(Print o1, Print o2) {
return o2.priority-o1.priority;
}
});
for(int i=0; i<N; i++) {
int number = sc.nextInt();
if(i==location) {
priority = number;
}
Print p = new Print(number, i);
q.add(p);
}
int cnt=0;
while(!q.isEmpty()) {
cnt++;
Print p = q.poll();
//동일한 위치에있던 숫자가 프린트 된거라면
if(p.location==location && p.priority ==priority) {
System.out.println(cnt);
break;
}
}
}
}
}
class Print{
int priority;
int location;
public Print(int priority, int location) {
this.location = location;
this.priority = priority;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
1927문제 최소 힙(우선순위 큐) Java (0) | 2021.09.27 |
---|---|
11279문제 최대 힙(우선순위 큐) Java (0) | 2021.09.27 |
11866문제 요세푸스 문제 0(큐,덱) Java (0) | 2021.09.24 |
2164문제 카드2(큐/덱) Java (0) | 2021.09.24 |
10773문제 제로(Stack) Java (0) | 2021.09.24 |