컴공댕이 공부일지

[ java ] 프로그래머스 ( 42748 K번째 수 ) ⭐배열의 복사 / 정렬 [copyArray, copyOf, copyOfRange 총 정리] 본문

문제 풀이/코딩 문제 풀이 모음

[ java ] 프로그래머스 ( 42748 K번째 수 ) ⭐배열의 복사 / 정렬 [copyArray, copyOf, copyOfRange 총 정리]

은솜솜솜 2023. 5. 9. 13:58
728x90

목차

 

#문제 및 내 풀이 소개

#배열의 복사

    a. System.copyArray

    b. Arrays.copyOf

    c. Arrays.copyOfRange

#배열의 정렬

    a. sort()

    b.버블 정렬

    c.퀵 정렬

 

📚 프로그래머스 K번째수

https://school.programmers.co.kr/learn/courses/30/lessons/42748

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

배열의 특정 구간을 뽑아 복사하는 문제!

 

 

나의 정답 코드 (copyArray, 버블 정렬 활용)

class Solution {
    public int[] solution(int[] array, int[][] commands) {
        int t=commands.length;
        int[] answer = new int [t];
        int i=0;
        int j=0; 
        int k=0;
        
        int x=0;
        
        while(x<t) {
            //인덱스니깐 1씩 뺴주기
            i= commands[x][0]-1;
            j= commands[x][1]-1;
            k= commands[x][2]-1;
            
            //배열 자르기 
            int [] copy = new int [j-i+1];
            System.arraycopy(array, i, copy, 0, j-i+1);
            
            
            int temp=0;
            //자른 배열 정렬하기 (버블 정렬)
            for(int m=0; m<copy.length-1; m++) {
                for(int n=0; n<copy.length-1-m; n++) {
                    if(copy[n+1]<copy[n]) {
                        temp=copy[n];
                        copy[n]=copy[n+1];
                        copy[n+1]=temp;
                    }
                }
            }
            
            answer[x]=copy[k];
            x++;
        }
        
        return answer;
    }
}

 


 배열의 복사 

 

 

#1 System.arraycopy()

(내가 쓴 방법)

System 클래스의 배열 복사 메소드이다. 총 다섯 개의 파라미터가 들어간다.

System.arraycopy( 원본, 읽어오기 시작 위치 , 복사본, 받아오기 시작 위치 , 읽어 올 길이)

[ arraycopy 예제 ] 

class CopyArr {
    public static void main (String[] args) {
        int [] arr = {1,3,5,7,9,2,4,6,8};
        
        int [] copy = new int [10];
        
        //arr배열의 2번 인덱스부터 길이 5만큼 읽어와서 copy 1번 인덱스부터 저장.
        System.arraycopy(arr, 2, copy, 1, 6);
        
        for(int i=0; i<copy.length; i++) {
        	System.out.print(copy[i]+" ");
        }
        
    }
}

>>> 0 5 7 9 2 4 6 0 0 0 

 

 

 

 

 

java.util 패키지

java.util 패키지에는 프로그램을 개발하는 데 사용할 수 있는 유용한 *유틸리티 클래스가 다수 포함되어 있습니다.

실제로 java.lang 패키지 다음으로 가장 많이 사용되는 패키지가 java.util 패키지입니다.

하지만 import 문을 사용하지 않아도 바로 사용할 수 있는 java.lang 패키지와는 달리

java.util 패키지는 import 문으로 패키지를 불러오고 나서야 클래스 이름만으로 사용할 수 있습니다.

 

*유틸리티 클래스 (인스턴스 메소드나 변수 없이, 정적 메소드와 변수만을 제공하는 클래스)

 

 

#2-1 copyOf()

전달받은 배열의 길이만큼 새로운 배열로 복사해 반환하는 메소드

새로운 배열의 길이가 원본보다 길면, 빈 곳은 알아서 기본값으로 채운다.

Arrays.copyOf(원본, 읽어 올 길이)

[ copyOf 예제 ] 

import java.util.Arrays;

class CopyArr {
    public static void main (String[] args) {
        int [] arr = {1,2,3,5,4,7};
        
        
        //arr배열의 처음부터 길이 10만큼 읽어와서 copy에 저장. 빈 공간은 기본값으로 채움.
        int [] copy = Arrays.copyOf(arr, 10);
        
        
        for(int i=0; i<copy.length; i++) {
        	System.out.print(copy[i]+" ");
        }
        
    }
}

>>> 1 2 3 5 4 7 0 0 0 0 

 

copyOf는 arraycopy 메소드와 달리 복사 지점 및 범위가 디테일하게 지정되진 않는다.

다만, copyOf() arraycopy보다 약 2배 가량 빠르다고 한다.

 

 

 

 

#2-2 copyOfRange()

전달받은 배열의 특정 구간의 요소를 새로운 배열로 복사해 반환하는 메소드

Arrays.copyOf(원본, 읽기 시작 지점, 읽기 끝 지점(포함x))

Arrays.copyOf(arr, 2, 5);

이러면 arr의 2번 인덱스부터 4번 인덱스까지의 배열 요소를 복사한다.

 

5번 인덱스는 포함되지 않으니 주의! 


[ copyOfRange 예제 ] 

 

import java.util.Arrays;

class CopyArr {
    public static void main (String[] args) {
        int [] arr = {2,7,8,4,3};
        
        
        //arr배열의 0보다 크거나 같고, 3보다 작은 인덱스 읽어와서 새로운 배열 반환
        int [] copy = Arrays.copyOfRange(arr, 0, 3);
        
        
        for(int i=0; i<copy.length; i++) {
        	System.out.print(copy[i]+" ");
        }
        
    }
}

>>> 2 7 8 

 

 

 

 

정리해보면,

#배열의 복사

  • a. System.copyArray (시작지점과 길이로 지정, 복사본의 시작 지점도 지정 가능)
  • b. Arrays.copyOf (길이로 복사)
  • c. Arrays.copyOfRange (구간으로 복사)

배열의 정렬

 

#1 sort 메소드 활용

전달받은 배열의 모든 요소를 오름차순으로 정렬하는 Arrays 클래스의 메소드.

 Arrays.sort(정렬할 배열);

copyOf, copyOfRange 처럼 Arrays 클래스의 메소드 중 하나로

원본 배열의 순서를 바꾸어 정렬해주는 메소드이다.


추가로 배열의 일부분만 정렬할 수도 있다.

 Arrays.sort(정렬할 배열, 시작인덱스, 끝인덱스(포함x));

Arrays.sort(arr, 0, 4);

이러면 arr 배열의 인덱스 0번부터 3번까지 정렬된다.

 

 

#2 버블 정렬

내가 쓴 방법이다. 옆의 값과 비교하면서 정렬해나가는 기초적인 정렬 방법.

 

#3 퀵 정렬

void sort(int[] a, int left, int right){
        int pl = left;
        int pr = right;
        int x = a[(pl+pr)/2];

        do{
            while(a[pl] < x) pl++;
            while(a[pr] > x) pr--;
            if(pl <= pr){
                int temp = a[pl];
                a[pl] = a[pr];
                a[pr] = temp;
                pl++;
                pr--;
            }
        }while(pl <= pr);

        if(left < pr) sort(a, left, pr);
        if(right > pl) sort(a, pl, right);
    }

퀵 정렬은 이전에도 공부했었다. 복습하는 느낌으로 한 번 연습해봤다.

 

 

 

 

 

참고) TCP 스쿨 - Array 클래스

http://www.tcpschool.com/java/java_api_arrays

728x90
Comments