BOJ

[백준 10811번/JAVA] 바구니 뒤집기 | 배열

syj0522 2024. 3. 5. 20:05

문제

풀이

  1. N, M을 받는다.
  2. 길이가 N인 배열을 선언하고 1...N으로 초기화한다.
  3. for문을 M번 반복하며 i, j를 받는다.
  4. i, j를 받을 때마다 i~j 범위를 역순으로 변경한다.
  5. 배열을 출력한다.

코드

import java.util.*;

public class Main {
    public static void main(String[] args){
        //N, M 받기
        //길이가 N인 배열 선언, 1...N으로 초기화
        //for문 M번 반복하며 i, j 받고, 범위 i~j를 역순으로 변경
        //배열 출력

        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int M = sc.nextInt();
        int[] arr = new int[N];

        for(int i=0; i<N; i++) {
            arr[i] = i+1;            
        }

        for(int i=0; i<M; i++) {
            int first = sc.nextInt()-1;
            int last = sc.nextInt()-1;

            while(first<last) {
                int tmp = arr[first];
                arr[first] = arr[last];
                arr[last] = tmp;
                first++;
                last--;
            }
        }

        for(int i=0; i<N; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

Note

  • i~j 범위를 역순으로 정렬하는 코드 : i, j 범위에 따라 first, last를 바꾸는 횟수를 경우의 수로 나누어 구현하는 방식으로 접근했으나 실패
    • 모든 경우의 수를 고려하지 않았다. (모든 경우의 수를 찾기가 쉽지 않았다)
    • 코드 수정 시 문제에서 제시된 입력값과 출력값을 보고 그 경우에만 올바르게 출력되도록 했다.
  • 경우의 수를 구하기 어려울 경우, 간단히 비교연산자를 사용하는 아이디어를 떠올리기
//틀린 코드
for(int p=0; p<M; p++) {
    int i = sc.nextInt()-1;
    int j = sc.nextInt()-1;
    if((j-i)/2==0) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }else {
        for(int q=0; q<=(j-i)/2+1; q++) {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i++;
            j--;
            if(j-i<=2)
                continue;
        }				
    }
		}