[백준]회전하는 큐

allnight5·2023년 7월 1일
0

백준

목록 보기
3/7

링크

import java.util.Deque;
import java.util.LinkedList;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.StringTokenizer;
public class Main
{
	public static void main(String[] args) throws IOException{
	    Deque<Integer> queue = new LinkedList<>();
	    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	    StringTokenizer st = new StringTokenizer(br.readLine());
        //범위와 찾는 갯수를 range와 findNumbers에 받는다.
	    int range = Integer.parseInt(st.nextToken());
	    int findNumbers = Integer.parseInt(st.nextToken());
        //큐에 범위에 대해 입력해준다.
	    initDeque(queue, range);
        
	    int answer =0;
        //줄을 바꿔준다.
        st = new StringTokenizer(br.readLine());
	    for(int i=0; i<findNumbers; i++){
        	//찾는 숫자를 받는다.
	        int number = Integer.parseInt(st.nextToken());
            //맨 앞과 찾는 숫자가 같다면 빼고 다음으로 넘어간다.
            if(queue.peek() == number) {
                queue.pop();
                continue;
            } 
            //맨앞이 아니라면 찾아서 이동 횟수를 더해준다.
            int count = moveCount(queue, number, queue.size()/2); 
	        answer += count;
	    }
        //BufferedReader를 닫는다.
	    br.close();
        //answer를 출력해서 답을 보여주자!
	    System.out.println(answer);
	}
    //몇번이나 움직이는지 확인한다.
	public static int moveCount(Deque<Integer> queue, int number, int mid){ 
    	//위치를 찾는다.
	    int index = findIndex(queue, number); 
        //위치가 중간+1 보다 작거나 같다면
        //우측이나 좌측이나 같다 그러니 우측으로 움직인다
        //아니라면 왼쪽으로 이동하도록한다.
	    if(index<=mid+1){  
	        return moveRight(queue, number);
	    }else{  
	        return moveleft(queue, number);
	    } 
	}
	public static int findIndex(Deque<Integer> queue, int number){
	    int count = 0;
        //어디있는지 빼면서 확인해야 하니 새로운 Deque에 담아주자
	    Deque<Integer> tempQ = new LinkedList<>(queue);   
        //빼면서 위치가 어딘지 찾아서 반환한다.
	    while(true){ 
	        int now = tempQ.poll();
	        count++;
	        if(now == number) break;
	    }
	    return count;
	}
	//우측으로 빼면서 할때는 조건문을 확인하고 +1을 해줘야한다.
	public static int moveRight(Deque<Integer> queue, int number){  
	    int count =0;
	    while(true){ 
	        int now = queue.poll();
	        if(now == number) break;
	        queue.offer(now); 
	        count++; 
	    }
	    return count;
	}
	
	//우측으로 빼면서 할때는 조건문을 확인하기전에 +1을 해줘야한다.
	public static int moveleft(Deque<Integer> queue, int number){ 
	    int count = 0;
	    while(true){ 
	        int now = queue.pollLast();
	        count++;
	        if(now == number) break;
	        queue.offerFirst(now);
	    }
	    return count;
	}
	//큐에 1부터 범위까지 넣어줍시다.
	public static void initDeque(Deque<Integer> queue, int range){ 
	    for(int i=1; i<=range;i++){
	        queue.add(i);
	    } 
	}
}
profile
공부기록하기

0개의 댓글