백준|1966번|프린터 큐

JSK·2022년 7월 31일
0

자바 PS풀이

목록 보기
6/51

문제설명
1부터 10까지로 이루어진 수열을 입력받고 그 수열을 큐로 구현한 뒤 나머지 숫자들중 현재 숫자보다 큰 숫자가 하나라도 있으면 이 수를 큐의 맨뒤에 재배치하는 큐가 있을 때 이 큐에서 어떤 요소가 몇 번째로 큐에서 삭제되는지 구하는 문제입니다.

작동 순서
1. 테스트케이스의 수를 입력받습니다.
2. 수열의 길이 N과 몇번째로 삭제되는지 확인할 수의 위치인 M을 입력받습니다.
3. 원하는 수의 위치를 where로 지정하고 지금까지 삭제된 원소의 개수를 count로 지정합니다.
4. 원하는 수가 삭제될 때까지 반복되는 반복문을 생성합니다.
5. 그 반복문안에서 수열에서 가장 큰 수를 찾고 그 수가 가장 큰 수인 경우 삭제하고 count++, where--해줍니다. 이때 where가 0인 상태에서 삭제한 경우 찾는 숫자를 삭제한 것이므로 반복문을 종료합니다.
6. 가장 큰 수가 아닌 경우 그 수를 맨뒤로 보냅니다. 그리고 where++를 해줍니다. 이때 where가 0인경우 찾는 숫자가 맨앞에서 맨뒤로 간것이기 때문에 where를 큐의 길이-1로 지정해줍니다.
7.반복문을 반복하다 답을 찾은 경우 반복문을 종료하고 count를 출력해줍니다.

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class 백준_1966번_프린터큐 {
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        Queue<Integer> printList;
        int T=Integer.parseInt(br.readLine());
        for(int i=0;i<T;i++){
            printList=new LinkedList<>();
            st=new StringTokenizer(br.readLine());
            int N=Integer.parseInt(st.nextToken()), M=Integer.parseInt(st.nextToken());
            st=new StringTokenizer(br.readLine());
            for(int j=0;j<N;j++) printList.add(Integer.parseInt(st.nextToken()));
            int max;
            int count=0;
            int where=M;
            boolean delete_target=false;
            while (!delete_target){
                max=Collections.max(printList);
                while (true){
                    if (printList.peek()==max){
                        printList.remove();
                        count++;
                        if(where==0) delete_target=true;
                        else where--;
                        break;
                    }
                    else{
                        printList.offer(printList.poll());
                        if(where==0) where=printList.size()-1;
                        else where--;
                    }
                }
            }
            System.out.println(count);
        }
    }
}

후기
이런 문제를 많이 풀어본 경험이 없어서 좀 헤매면서 풀다보니 코드도 길고 지저분해진 것 같습니다. 아픙로 다른 자료구조나 더 좋은 방법들을 찾을 수 있도록 노력해야 할 것 같습니다.

profile
학사지만 AI하고 싶어요...

0개의 댓글