Today
-
Yesterday
-
Total
-
  • 백준 : 회전하는 큐
    코딩테스트 문제 풀이/백준 2023. 11. 20. 00:01

    문제

    내 코드

    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);
        }
    }

    '코딩테스트 문제 풀이 > 백준' 카테고리의 다른 글

    행성 X3  (0) 2023.11.21
    백준 : 힙 정렬2  (0) 2023.11.21
    백준: 요세푸스 문제  (0) 2023.11.20
    백준: 최소, 최대  (0) 2023.11.20
    백준 25556번 : 포스택  (0) 2023.11.20

Designed by Tistory / Custom by 얼거스