반응형
출처: www.acmicpc.net/problem/1966
1966번: 프린터 큐
첫 줄에 test case의 수가 주어진다. 각 test case에 대해서 문서의 수 N(100이하)와 몇 번째로 인쇄되었는지 궁금한 문서가 현재 Queue의 어떤 위치에 있는지를 알려주는 M(0이상 N미만)이 주어진다. 다음
www.acmicpc.net
풀이과정
1. 입력이 많으니 먼저 정리하자
첫줄은 테스트 케이스 갯수
N : 해당 문서의 전체 수
M : 궁금한 문서의 위치, 0부터 셈(1번째로 취급)
2. 자바 priorityQueue 풀었던 과정을 떠올리자.
작성코드
package Test;
import java.util.*;
import java.io.*;
public class MainNew {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
int[] answer = new int[T];
// 테스트케이스 갯수만큼 반복하면서 입력 받기
for (int i = 0; i < T; i++) {
int N = sc.nextInt();
int M = sc.nextInt();
ArrayList<Integer> arrList = new ArrayList<>();
for (int j = 0; j < N; j++) {
int tmp = sc.nextInt();
arrList.add(tmp);
} // arrayList 에 주어진 큐 담기
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Collections.reverseOrder());
for (int k = 0; k < N; k++) {
priorityQueue.add(arrList.get(k));
} // priorityQueue 에 옮겨 담기, 내림차순
int cnt = 0;
while (!priorityQueue.isEmpty()) {
// 새로 만든 큐와 기존의 리스트의 각각의 값을 비교한다.
for (int u = 0; u < arrList.size(); u++) {
// 큐에서 꺼내서 비교해보고 기존 리스트의 값과 같으면 꺼냄
if (priorityQueue.peek() == arrList.get(u)) {
priorityQueue.poll();
// 출력 순서 카운팅
cnt++;
// 여기서 그냥 끝내버리면 안된다.
// 기존리스트에 담겨있던 값의 위치까지 동일한지 체크 (혹시 동일한 값이 있으면 여기서 한번 더 체크됨)
if (M == u) {
answer[i] = cnt;
priorityQueue.clear();
break;
}
}
} // for u
} // while
} // for i
for (int i = 0; i < T; i++) {
System.out.println(answer[i]);
} // 정답 출력
}
} // MainNew
memo
bufferdreader,writer 보다는 아직은 이게 더 익숙한 것 같다.
자꾸 에러가 난다..
큐에는 peek 도 있다는거 잊지말자
구현하지 못한 부분은 동일 값을 체크해줄 수 있는 기존 값 위치 필터링 부분.
저번에 풀었던 프로그래머스의 프린터 문제와 매우 비슷하다.
사실 똑같은 것 같다. 찾아보니 한달밖에 안되었는데 완전히 풀지 못하였다ㅜㅜ
그래도 처음 풀때보다는 수월하다.
평일에 푸는 건 정말 힘든 것 같다. 그래도 정말 조금의 보람이 있었다..
반응형
'머리맞대는이야기 > 백준' 카테고리의 다른 글
| [2920] 음계 (0) | 2020.10.14 |
|---|---|
| [7490] 0 만들기 (0) | 2020.10.04 |
| [1074] Z (0) | 2020.10.04 |
| [2747] 피보나치 수 (0) | 2020.10.03 |
| [1939] 중량제한 (0) | 2020.09.30 |