https://www.acmicpc.net/problem/1966
구현 Java
흠 단순히 큐 문제라기엔 변수를 좀 고려해야하는 문제였다.
우선순위대로 출력하는데 우선순위가 높은 문서가 올때까지 계속 뒤로 넘기는.
근데 또 포인터로 따라가면서 지정한 문서가 언제 출력되는지 출력하는 문제다.
접근방법
stream.anyMatch써서 뒤에 나보다 우선순위가 높은 문서가 있으면 뒤로 넘기고 아니면 pop했다.
매번 조건이 두가지로 나뉘는데
1. 우선순위가 높은문서가 뒤에 있을때
pop해주고 그 숫자 그대로 add해준다.
pop할때 마다 target문서 인덱스를 -- 해주고 0이면 q.size()-1 해줬다.
2. 나보다 우선순위가 높은 문서가 뒤에 없을때
주의* 이때만 cnt를 1 증가 시켜줘야한다. cnt는 target문서가 몇번째로 출력되는지를 담고 있는 변수
따라서 문서를 하나 출력할때마다 ++
이때 target문서가 인덱스 0, 즉 target문서를 출력할때가 됐다면 cnt를 출력하고 break
지금 출력하는 문서가 target문서가 아니면 target-- (이때는 target문서가 첫번째가 아닌 경우니까 맨뒤로 보내는 경우는 고려하지 않아도 된다.)
오답노트
for each문으로 큐 이터레이터 쓰려고 했는데 concurrent 어쩌구 오류가 났다. nullpoint오류 비슷한거라고 하는데
for each문 대신 for문을 쓰거나 while문을 쓰면 해결할 수 있다.
자바로 문제푸는거 아직 익숙하진 않지만 그래도 스트림쓰면서 하니까 편하다.
소스코드
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class I1966 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int T = in.nextInt();
for(int t = 0 ; t < T ; t++){
int N = in.nextInt();
int target = in.nextInt();
Queue<Integer> q = new LinkedList<>();
for(int nn = 0 ; nn < N ; nn++){
int p = in.nextInt();
q.add(p);
}
int cnt = 0;
while(!q.isEmpty()){
if (q.stream().anyMatch(n->q.peek()<n)) {
int del = q.remove();
q.add(del);
if(target == 0){
target = q.size()-1;
}
else
target--;
} else {
cnt++;
if(target == 0){
System.out.println(cnt);
break;
}else{
q.remove();
target--;
}
}
}
}
}
}
'알고리즘 문제풀이' 카테고리의 다른 글
[백준 17298] 알고리즘 101일차 : 오큰수 (0) | 2021.07.07 |
---|---|
[백준 5430] 알고리즘 10^2일차 : AC (0) | 2021.07.06 |
[백준 11656] 알고리즘 98일차 : 접미사 배열 (0) | 2021.07.02 |
[백준 11286] 알고리즘 97일차 : 절댓값 힙 (0) | 2021.07.01 |
[백준 1927] 알고리즘 96일차 : 최소 힙 (0) | 2021.06.30 |