컴공댕이 공부일지
[ java ] 프로그래머스 ( 42748 K번째 수 ) ⭐배열의 복사 / 정렬 [copyArray, copyOf, copyOfRange 총 정리] 본문
[ java ] 프로그래머스 ( 42748 K번째 수 ) ⭐배열의 복사 / 정렬 [copyArray, copyOf, copyOfRange 총 정리]
은솜솜솜 2023. 5. 9. 13:58목차
#문제 및 내 풀이 소개
#배열의 복사
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 클래스
'문제 풀이 > 코딩 문제 풀이 모음' 카테고리의 다른 글
[ java ] 백준 (7568 덩치) (3) | 2023.05.22 |
---|---|
[ java ] 백준 ( 2231 분해합 ) (0) | 2023.05.11 |
[java] 프로그래머스 (12906 같은 숫자는 싫어) 💥💦 (0) | 2023.05.04 |
[ java ] 백준 ( 11050 이항계수 1 ) ★팩토리얼 재귀함수 / 이항정리 (0) | 2023.05.02 |
[java] 백준 ( 2292 벌집 ) (0) | 2023.04.28 |