본문 바로가기
백준 문제풀이/Java

[백준] 10811번 바구니 뒤집기⚠️

by isfp_yykkng 2024. 3. 19.

[백준] 10811번 바구니 뒤집기 - Java

내 틀린 접근 & 해설참고 ⚠️

 

문제

해설

내 틀린 풀이
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] num = new int[n+1];
        int m = sc.nextInt();
        for(int i = 0; i < n+1; i++){
            num[i] = i;
        }
        //바구니 뒤집기
        for(int i = 0; i < m; i++) {
        	int temp = 0;
            int temp2 = 0;
            int a = sc.nextInt();
            int b = sc.nextInt();

            if((b-a)==0) continue;
            if((b-a) < 3){
                temp = num[a];
                num[a] = num[b];
                num[b] = temp;
            }else{
                temp = num[a];
                temp2 = num[a+1];
                num[a] = num[b];
                num[b] = temp;
                num[a+1] = num[b-1];
                num[b-1] = temp2;
            }
        }
        for(int j = 1; j < num.length; j++) System.out.print(num[j] + " ");
    }
}

 

역순으로 만드는 방법에서 구하는 i 와 j (각 a,b)의 차를 통해서 총 세가지로 정의했다.

1) 차이가 0일 때는 바꿀 필요가 없으므로 continue를 통해 넘어간다.

2) 차이가 3보다 작을 때i와 j의 자리에 있는 위치만 서로 바꾼다.

3) 차이가 3이나 4일 때(else) i와 j의 자리를 바꾸고, i+1자리와 j-1의 자리를 서로 각각 바꾼다.

 

이런 식으로 접근하여 풀었고 인텔리제이에서 돌렸을 때는 답은 맞게 나왔지만, 백준 정답에는 "틀렸습니다." 가 나왔다.

올바른 접근 (해설 참고)
import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt(); // n개의 바구니
		int m = sc.nextInt(); // 시행 횟수

		int temp=0;
		
		int num[] = new int[n]; 
		for(int i=0;i<num.length;i++) {
			num[i] = i+1;	
		}
		
		for(int i=0;i<m;i++) { 
			int a = sc.nextInt()-1; //1 > 0번째 배열
			int b = sc.nextInt()-1; //5 > 4번째 배열
			
			while(a<b) { 
				temp = num[a]; 
				num[a] = num[b]; 
				num[b] = temp; 
				a++;	
				b--;	
			}
		}
		sc.close();
		
		for(int i=0;i<num.length;i++) {
			System.out.print(num[i]+" ");
		}
		
		
	}
}

 

나와 다르게 a, b를 각각 ++, -- 를 통해서 올리고 내리는 while문의 a<b라는 조건을 통해서 다음 칸을 swap하는 구조로 짤 수 있다.