(문제풀이)
백준 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번 처리됨)
반응형