일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 알고리즘
- Queue
- 아스키코드
- 스택
- 문자열
- 완전탐색
- 배열
- 브루트포스
- 탐색
- BufferedReader
- 다리 만들기
- Java
- 백트래킹
- 백준
- 새벽코딩
- HashMap
- SQL
- Stack
- 시뮬레이션
- 프로그래머스
- DP
- BFS
- oracle
- Python
- 구현
- LIS
- 다이나믹프로그래밍
- 빅데이터
- dfs
- 그리디
- Today
- Total
새벽코딩
[백준] [1966] 프린터 큐 본문
문제
여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 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 이하의 정수이고, 중요도가 같은 문서가 여러 개 있을 수도 있다.
출력
각 테스트 케이스에 대해 문서가 몇 번째로 인쇄되는지 출력한다.
예제 입력 1 복사
3
1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1
예제 출력 1 복사
1
2
5
※코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
Scanner sc = new Scanner(System.in);
int T = Integer.parseInt(br.readLine());
for(int t=0;t<T;t++) {
st = new StringTokenizer(br.readLine());
//boolean end = false;
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] prior = new int[10];
Queue<Integer> q = new LinkedList<>();
Queue<Integer> tmp = new LinkedList<>();
st = new StringTokenizer(br.readLine());
int maxVal = 0;
for(int i=0;i<N;i++) {
int num = Integer.parseInt(st.nextToken());
// 우선순위 개수 체크
prior[num]++;
q.add(num);
if(maxVal < num) maxVal = num;
if(i == M) tmp.add(1);
else tmp.add(0);
}
int cnt = 0;
while(true) {
// 현재가장 상위값
int curNum = q.peek();
int p;
boolean maxChk = false;
// 현재값보다 큰값이 있는지 탐색
for(int k=curNum+1;k<=maxVal;k++) {
if(prior[k] > 0) {
maxChk = true;
// 탈출
break;
}
}
// 현재값보다 큰값이 없으면
if(!maxChk) {
cnt++;
// 값을 빼면서 우선순위 개수 감소
prior[q.peek()]--;
q.poll();
// 대상값이 나왔는지 확인
p = tmp.peek();
// 대상값이라면 출력후 종료
if(p == 1) {
System.out.println(cnt);
// 탈출
break;
} else { // 대상값이 아니라면 아웃
tmp.poll();
}
} else { //현재값보다 큰값이 있으면
// 해당값을 뒤로
q.add(q.peek());
tmp.add(tmp.peek());
q.poll();
tmp.poll();
}
}
}
}
}
※생각정리
이 문제를 풀기위해 큐 2개와 배열 1개를 사용했다. 먼저 배열은 1 ~ 9 까지 해당 우선순위의 개수를 담았고 두개의 큐는 각각
1. 해당 숫자를 담은 큐
2. 해당 숫자의 위치를 담는 큐
로 사용했다.
큐의 첫번째 값부터 탐색하며 해당 숫자의 우선순위보다 큰 우선순위가 있는지 개수 배열에서 확인하였다. 만약 해당 숫자보다 우선순위가 큰 숫자가 없다면 해당 숫자를 빼고 우선순위 배열에서 개수를 감소하였다.
숫자의 위치를 담는 큐에는 해당 숫자는 1을 넣었고 아닌 곳은 전부 0을 넣었다.
빠지는 숫자의 인덱스를 구하기 위해 해당숫자가 빠질때 위치를 담은 큐에서도 똑같이 값을 빼내었다.
마지막으로 위치를 담은 큐에서 1이 출력된다면 반복문을 멈추고 카운트한 수를 출력하였다.
-새벽코딩-
'알고리즘' 카테고리의 다른 글
[백준] [1213] 팰린드롬 만들기 (0) | 2022.11.30 |
---|---|
[백준] [14425] 문자열 집합 (0) | 2022.11.30 |
[백준] [2161] 카드1 (0) | 2022.11.28 |
[백준] [11866] 요세푸스 문제0 (0) | 2022.11.27 |
[백준] [5622] 다이얼 (0) | 2022.11.26 |