반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

배움과 기록의 장

[백준] 10812번: 바구니 순서 바꾸기 (Java) 본문

problem solving

[백준] 10812번: 바구니 순서 바꾸기 (Java)

chaeunii 2023. 3. 9. 17:51

✅ 문제

https://www.acmicpc.net/problem/10812

 

✅ 풀이

  • 우선 바구니 배열을 만들어 1부터 순서대로 담아줬다. 그리고 주어진 begin, end, mid를 기준으로 바구니 배열을  _begin / begin_mid / mid_end / end_ 이렇게 4개의 배열로 나눠주었다. (그림 참고)
  • begin_mid, mid_end의 순서를 바꾸어 최종적으로 _begin, mid_end, begin_mid,  end_ 순의 배열을 출력하면 끝
  •  

  • 배열을 쪼개고, 합치는 과정에서 사용한 메서드 (배열 복사)
    • Arrays.copyOfRange(Object[] original, int from, int to)
      : 배열의 범위를 지정해서 복사
        Object[]  original = 복사하고자 하는 원본배열
        int from = 복사하려는 시작 인덱스
        int to = 복사하려는 마지막 인덱스+1
    • System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
      : 배열의 범위를 지정해서 복사해서 대상배열에 붙여넣음        
        Object src = 복사할 원본 배열
        int srcPos = 원본배열의 복사 시작 인덱스
        Object dest = 붙여넣기 할 대상 배열
        int destPos = 대상 배열의 복사 시작 인덱스
        int length = 복사할 요소의 갯수
  • 개선
    • _begin / begin_mid / mid_end / end_ 나눌 때 굳이 배열로 만들어줄 필요가 없는 것 같다. 결과배열인 result 배열만 새로 만들어 주고, 주어진 기준 인덱스들과 System.arraycopy 만 사용하여 순서바꿔 복사해주면 될 듯

 

✅ 코드

import java.util.Arrays;
import java.util.Scanner;

public class Main{
    public static void main(String[] args){

        Scanner sc = new Scanner(System.in);
        int basket = sc.nextInt();
        int rotate = sc.nextInt();

        int[] baskets = new int[basket];
        for(int i = 0; i < basket; i++){
            baskets[i] = i+1;
        }

        for(int i =0; i < rotate; i++ ){
            int begin = sc.nextInt()-1;
            int end = sc.nextInt()-1;
            int mid = sc.nextInt()-1;

            int[] _begin = Arrays.copyOfRange(baskets,0,begin);
            int[] begin_mid = Arrays.copyOfRange(baskets,begin,mid);
            int[] mid_end = Arrays.copyOfRange(baskets,mid,end+1);
            int[] end_ = Arrays.copyOfRange(baskets,end+1 ,baskets.length);

            System.arraycopy(_begin, 0, baskets, 0, _begin.length);
            System.arraycopy(mid_end, 0, baskets, begin, mid_end.length);
            System.arraycopy(begin_mid, 0, baskets, begin+ mid_end.length, begin_mid.length);
            System.arraycopy(end_, 0, baskets, end+1, end_.length);
        }

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

 

반응형