(문제풀이)

백준 10811(Java) : 바구니 뒤집기

cogito-new 2023. 11. 27. 20:10
import java.util.ArrayList;
import java.util.Scanner;

public class Main_10811 {
    static ArrayList<Integer> basketChange(int x, int y, ArrayList<Integer> array){
        if(y-x < 2){
            int temp = array.get(y);
            array.set(y, array.get(x));
            array.set(x, temp);
        } else {
            for (int i = 0; i < (y - x+1)/2 ; i++) {
                int temp = array.get(y - i);
                array.set(y - i, array.get(x + i));
                array.set(x + i, temp);
            };
        };
        return array;
    };


    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int M = scanner.nextInt();

        ArrayList<Integer> array = new ArrayList<>();

        // 바구니 번호 매기기
        for(int i = 1; i<= N; i++){
            array.add(i);
        };

        // 바구니 위치 바꾸기
        for(int i = 0; i<M; i++){
            int x = scanner.nextInt();
            int y = scanner.nextInt();
            // arrayList idx = 0 부터 시작
            basketChange(x-1, y-1, array);
        };
        // 출력
        for(int i = 0; i<array.size(); i++){
            System.out.print(array.get(i) + " ");
        };
    };
};

 
뒤집는 경우의 수 2가지로 분리
총 8개의 바구니가 존재한다고 가정 : 1, 2, 3, 4, 5, 6, 7, 8
 
1) 1번부터 2번 : 2 1 4 5 6 7 8 -> 1과 2의 위치 한번만 바꿔주면 됨
    1번부터 3번 바꾸는 경우 : 3 2 1 4 5 6 7 8 -> 2는 바뀌어도 그대로임. 
-> 따라서 바구니 수의 차이가 1 or 0인 경우 해당 바구니의 번호 한번만 바꿔줌
 
2) 두 바구니 위치 차가 1 이상인 경우
1번부터 4번 : 4 3 2 1 5 6 7 8 -> 3인 경우 2번 바꾸어야 하지만 주어진 계산식인 (y-x)/2 만큼 바꾸어 주게 되면 
교환이 한번 덜 일어나게 되므로 (y-x+1) /2 로 2번 바꾸도록 처리해줌
1번부터 5번 : 5 4 3 2 1 6 7 8 -> 4인 경우 2번 바꾸어 주면 됨 (계산식에서 (y-x+1)/2 로 처리해도 나머지는 버리므로 2번 처리됨)
 

반응형