백준 문제풀이

[백준] 1021번

Dodledd 2024. 4. 9. 16:33

 

이번 문제는 저번에 자료구조를 공부하고 정리해서 글을 쓴 것을 응용하여 백준 문제에 도전했다.

 

처음에 문제를 제대로 이해하지 못해서 삽질을 오래했다.

삽질내용 : 최대한 효율적으로 하기 위해 빠르게 찾는게 목적이다, 하고 이건 덱에 관한 문제니까 앞 뒤로 삭제가 가능하니 앞, 뒤에서 바로바로 삭제하고 값을 빨리 찾아야지 ! 하고 했다가 예제 출력보다 낮게 나와서 일일히 찍어보느라 오래걸렸다.

앞 뒤로 삭제하는게 아닌 그냥 앞에서만, removeFirst() 메소드만 사용하는 것이였다...

 

다시 돌아와서 처음에 짠 코드보다 약 2배가량 줄이는 리팩토링을 거쳤다.

import java.io.*;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class b1021 {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(bf.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int count = 0; // 2,3 번 연산의 횟수
        int dSize = 0; // 길이의 가운데 값
        //n세팅
        LinkedList<Integer> deque = new LinkedList<Integer>();
        for(int i =1 ; i<n+1; i++){
            deque.add(i);
        }
        //m 세팅
        st = new StringTokenizer(bf.readLine());
        int[] arr = new int[m];

        //m 세팅과 동시에 연산
        for(int i =0; i<m; i++){
            arr[i] = Integer.parseInt(st.nextToken());
            if(deque.size() % 2==0){ // 가운데 값이 짝수일 경우를 방지
                dSize = deque.size() / 2 -1;
            } else{
                dSize = deque.size() / 2;
            }

            //실제 연산부분
            while (deque.getFirst() != arr[i]){
                if(deque.indexOf(arr[i])<=dSize) { //앞을 제거해서 뒤에 추가
                    int tmp = Integer.parseInt(String.valueOf(deque.removeFirst()));
                    deque.addLast(tmp);
                    count++;
                } else { //뒤를 제거해서 앞에 추가
                    int tmp = Integer.parseInt(String.valueOf(deque.removeLast()));
                    deque.addFirst(tmp);
                    count++;
                }
            }
            deque.removeFirst();
        }
        System.out.println(count);
    }
}

 

 

나름 재밌었다!