문제
https://www.acmicpc.net/problem/1966
풀이(18분)
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int t = Integer.parseInt(br.readLine());
for(int i = 0; i < t; i++){
Queue<Check> queue = new LinkedList<>();
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
ArrayList<Integer> priorityList = new ArrayList<>();
st = new StringTokenizer(br.readLine());
for(int j = 0; j < n; j++){
int priority = Integer.parseInt(st.nextToken());
priorityList.add(priority);
if(j == m){
queue.add(new Check(true, priority));
continue;
}
queue.add(new Check(false, priority));
}
Collections.sort(priorityList);
int answer = 1;
int idx = priorityList.size() - 1;
while(true){
Check check = queue.poll();
if(check.priority < priorityList.get(idx)){
queue.add(check);
continue;
}
if(check.answer){
System.out.println(answer);
break;
}
answer++;
idx--;
}
}
}
public static class Check{
boolean answer;
int priority;
public Check(boolean answer, int priority){
this.answer = answer;
this.priority = priority;
}
}
}
Check 클래스는 정답을 출력해야하는 순번에 대한 값이였는지와, 우선도를 가진 값을 저장하는 클래스이다.
문제 풀이 순서는 다음과 같다.
1. 입력을 받은 것을 모두 큐에 넣는다.
1-1. 입력을 받으며 넣을 때 우선도에 대한 값을 따로 저장해둔다.
2. 우선도를 정렬하여 높은 순서부터 나오게 만든다.
3. 큐를 순환하며 우선도가 높다면 뽑아내고, 그렇지 못하다면 다시 큐에 추가한다.
3-1. 뽑아내는 과정에서 정답을 출력해야 한다면 출력하고 반복문을 멈춘다.
'문제 풀이 > 백준' 카테고리의 다른 글
[백준] 1105번. 팔(JAVA) (0) | 2025.01.25 |
---|---|
[백준] 22862번. 가장 긴 짝수 연속한 부분 수열 (large)(JAVA) (1) | 2025.01.23 |
[백준] 10828번. 스택(JAVA) (0) | 2025.01.19 |
[백준] 18258번. 큐 2(JAVA) (0) | 2025.01.19 |
[백준] 1303번. 전쟁 - 전투(JAVA) (0) | 2025.01.14 |