백준 : 회전하는 큐

김아무개·2023년 3월 14일
0

백준

목록 보기
2/17

문제

내 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = st.hasMoreTokens() ? Integer.parseInt(st.nextToken()) : 0;
        int M = st.hasMoreTokens() ? Integer.parseInt(st.nextToken()) : 0;
        st = new StringTokenizer(br.readLine());

		// cnt : 총 이동 횟수 저장할 변수
        int cnt = 0;
        
        // want : 찾아야 할 숫자를 저장할 변수 
        int want;
        
        // Queue 역할을 할 list
        ArrayList<Integer> list = new ArrayList();
        // list는 Q의 길이만큼 초기화
        while (list.size() < N) {
            // cnt 잠시 빌려 사용
            list.add(++cnt); 
        }
        // cnt 초기화
        cnt = 0; 

		// 다음 원하는 숫자를 찾을 때 까지 반복
        while (st.hasMoreTokens()) {
        	// want = 찾고 싶은 문자 저장
            want = Integer.parseInt(st.nextToken());

			// wnat가 list의 첫번째 값과 같다면
            // 조건 1에 해당하기 때문에 그냥 삭제
            if (want == list.get(0)) {
                list.remove(0);
                
                // 아래 실행문들 실행하지 않고 while 조건문으로 돌아감
                continue;
            }
            
            // 찾으려는 숫자의 인덱스 위치가
            // (리스트 크기-찾으려는 숫자의 인덱스 번호)보다 크면 
            // 큐의 뒷부분에 위치하고 있는것이기 때문에 if문 타고 뒤에서 부터 탐색
            if (list.size() - list.indexOf(want) < list.indexOf(want)) {
                // 뒤의 값 앞으로 이동
                
                // 처음 이동시 뒤로 거꾸로 이동하기 때문에 counting 되어야함
                cnt++;
                // 원하는 값을 찾을 때 까지 while문 반복
                while(list.get(list.size() - 1) != want) {
                 	// 뒤의 값을 앞으로 이동시키기 위한 add(  )
                    list.add(0, list.get(list.size() - 1));
                    // 맨 마지막 값을 맨 앞으로 옮겼으니 삭제해줌
                    list.remove(list.size() - 1);
                    // 이동이 일어났으므로 cnt+=1
                    cnt++;
                }
                // want값을 지워야 하기때문에 삭제
                list.remove(list.size() - 1);
            } else {
                // 앞의 값 뒤로 이동
                
                while(list.get(0) != want) {
                	// 맨 처음에 있는 값을 맨 뒤로 이동
                    list.add(list.size(), list.get(0));
                    // 맨 앞에 있는 값은 옮겨진걸로 되어야해서 지움
                    list.remove(0);
                    // 이동이 일어났으므로 cnt+=1
                    cnt++;
                }
                // want값을 지워야 하기 때문에 삭제
                list.remove(0);
            }
        }
        System.out.println(cnt);
    }
}
profile
Hello velog! 

0개의 댓글