시작하기, 뭐든

코딩테스트 - 정렬 "K번째수" 문제로 배우는 Arrays의 copyOfRange API 본문

코딩테스트

코딩테스트 - 정렬 "K번째수" 문제로 배우는 Arrays의 copyOfRange API

Gascon 2022. 1. 17. 23:29

시작하기, 뭐든 - 기록 30일차

 

해당 문제는 배열을 컨트롤할 값이 들어있는 commands 배열과 값이 들어있는 array 배열 모두 풀어야하기 때문에 이중 포문이 필수라고 생각했다.

 

        for(int i=0; i<commands.length; i++) {
        	for(int j=commands[i][0]-1; j<commands[i][1]; j++) {
        		array_num = new int[commands[i][1]-commands[i][0]+1];
        	}
        }

이런식으로 commands 안에서 array를 풀 때 commnads 안에 있는 값의 범위로 풀게 했던거다.

근데 찾아보니 어마어마한 API가 있었다.

(역시 똑똑한 자바 개발자들이 안만들었을리 없을텐데..! 역시 머리가 좋아야 몸이 고생을 덜...으으읍)

 

이중 포문을 돌릴 필요 없이, 배열을 복사할 때 시작 index와 끝 index 값을 넣어주면 딱 그만큼만 복사해오는 API다!

(또,또,또 나만 몰랐지 또,,)

 

애초에 Arrays에서 sort API를 쓸거였는데 왜 다른거 찾아볼 생각은 못했는지..

각설하고, API 익히자! 이번에 익히면 된다!!

 

[Arrays 복사 API] 

Arrays.copyOf(원본배열, 복사할 길이);

Arrays.copyOfRange(원본 배열, 복사할 시작인덱스, 복사할 끝인덱스) 인덱스는 0부터 시작하는것 기준

 

1. Arrays.copyOf

Arrays.copyOf는 심플하게 복사할 길이만큼 카피해준다.

예를 들어 Arrays.copyOf를 이용해서 배열을 복사한다고 가정해보자.

        int[] temp = {};
        for(int i=0; i<commands.length; i++) {
        	temp = Arrays.copyOf(array, 2);
        }
        for(int value : temp){
        	System.out.print(value +" "); 
        }

인자로 받은 array 배열을 복사하는데 길이 2 까지만 복사하겠다는 뜻이 된다.

그러면 array 배열 중에서 1, 5만 복사된다.

순서대로 몇개! 이런식으로 뽑아야 할 일이 있다면 이 API가 유용할거 같다.

 

2. Arrays.copyOfRange

Arrays.copyOfRange는 API 이름처럼 범위를 지정해서 카피해준다.

이번엔 Arrays.copyOfRange를 이용해서 배열을 복사한다고 가정해보자.

        int[] temp = {};
        for(int i=0; i<commands.length; i++) {
        	temp = Arrays.copyOfRange(array, 1, 4);
        }
        for(int value : temp){
        	System.out.print(value +" "); 
        }

인자로 받은 array 배열을 복사하는데 index 1에서부터 index 4까지 가져오라는 뜻인줄 알았지만..!

막상 실행해보면 끝 인덱스 -1의 index까지 가져오는거 같다.

(이거 주의해서 써야할듯..!!)

 

이 API만 알면, K번째 수 문제는 간단히 풀 수 있는 문제였다.

 

 

 

 

--------------------------------------------------------------------------------------------------------------------------------

여기서부터는 나의 개인적인 문제

--------------------------------------------------------------------------------------------------------------------------------

 

나는 이중 포문으로 지저분하게 삽질하다가 Sort API  문제에서 해결을 못했다.

        for(int i=0; i<commands.length; i++) {
        	int index = 0;
        	for(int j=commands[i][0]-1; j<commands[i][1]; j++) {
        		array_num = new int[commands[i][1]-commands[i][0]+1];
        		array_num[index] = array[j];
        		System.out.println("array_num[index] : " + array_num[index]);
        		index ++;
        	}
        	Arrays.sort(array_num);
        	System.out.println("array_num[index] : " + array_num[commands[i][2]-1]);

이중 포문도 그렇고 매우 지저분하지만, 아직도 해결 못한 부분은 Arrays.sort()를 하고나서 배열 값을 찍어보면 자꾸 0이 나온다는 거다.

나랑 비슷한 문제가 스택오버플로우에 있어서 아주 반갑게 들어갔지만, 난 그래도 해결을 못했다.

https://stackoverflow.com/questions/40450011/why-arrays-sortarr-is-returning-0-values

 

Why Arrays.sort(arr) is returning 0 values

import java.util.*; import java.util.Arrays; class stoner { public static void main(String[] args) { Scanner ob = new Scanner(System.in); int t = ob.nextInt(); int...

stackoverflow.com

default 값이 0으로 들어간 것들이 sort되어 앞으로 나오는거 같은데... 

그럴까봐 일부로 배열의 값을 가져오는 배열만큼만 설정해두는 것도 추가했는데 여전히 0만 나오더라.

배열 길이가 1일 때는 0이 아닌 제대로된 값이 나오는걸 봐선, default로 들어가는 0 문제가 있어보였다.

 

오만가지 삽질을 해봤지만, 해결을 못해서 일단 미제사건으로 여기에 남겨두려 한다.

(미래의 나는 좀 더 똑똑해져서 원인을 파악해보도록 하자. 화이팅 미래의 나!)

Comments