프린터 큐 성공출처다국어
한국어
시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초 | 128 MB | 31433 | 16997 | 13438 | 55.843% |
문제
여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 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
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | import java.io.BufferedReader import java.io.BufferedWriter import java.io.InputStreamReader import java.io.OutputStreamWriter import java.util.* val br = BufferedReader(InputStreamReader(System.`in`)) data class dot(var x:Int, var y:Boolean){ } fun main()=with(br){ val bw = BufferedWriter(OutputStreamWriter(System.out)) var q :Queue<dot> = LinkedList<dot>() var count = 0 val num = readLine()!!.toInt() for(i in 0 until num){ var num2= readLine()!!.split(" ").map{it.toInt()} var num3 = readLine()!!.split(" ").map{it.toInt()} for(k in 0 until num2[0]){ if(k==num2[1]) q.add(dot(num3[k],true)) else q.add(dot(num3[k],false)) } var max = q.maxByOrNull { it.x } while(true){ if(max!!.x==q.peek().x) { if(q.peek().y){ count++ break } else { count++ q.poll() max = q.maxByOrNull { it.x } } } else{ q.offer(q.poll()) } } bw.write("$count\n") count=0 q.clear() } bw.flush() bw.close() } /* 다른분의 코드를 참고하면서 알게된 내용 val maxIndex: Int = queue.indexOf(queue.maxOrNull()) -> queue에서 최대값의 인덱스를 알 수 있는 코드 for (j in 0 until N) boolQueue.add(j == M) -> [false, false, true, false] -> 위와 같이 조건에 성립한다면 true 아니라면 false가 들어감 -> 이러한 방법도 있구나 정도로 알면 될것같다. */ | cs |
'알고리즘 공부 > 미분류' 카테고리의 다른 글
백준 2231번 with Kotlin (0) | 2021.07.21 |
---|---|
백준 2108번 with Kotlin # hash맵을 List로 변환 (0) | 2021.07.21 |
백준 1929번 소수 구하기 #에라토스테네스의 체 (0) | 2021.07.20 |
이코테 정렬 (0) | 2021.07.17 |
백준 11866번 요세푸스 문제 with Kotlin (0) | 2021.07.17 |