[Sort] K번째 수

public static int[] solution(int[] array, int[][] commands) {
		int[] answer = {};
        answer = new int[commands.length];

        int startIdx = 0;
        int endIdx = 0;
        int returnIdx = 0;
        for (int i = 0; i < commands.length; i++) {

            startIdx = commands[i][0];
            endIdx = commands[i][1];
            returnIdx = commands[i][2];

            int [] ary = new int[endIdx-startIdx+1];
            int idx = 0;
            for(int k=startIdx-1; k<endIdx; k++) {
                ary[idx] = array[k];
                idx++;
            }
            Arrays.sort(ary);
            answer[i] = ary[returnIdx - 1];
        }

        return answer;
    }

내 코드는 먼저 시작과 끝, 반환될 위치의 인덱스를 각각 구했다. 입력받은 문자열 배열을 시작부터 끝까지 돌리며 사용되는 문자만 임시 배열에 담고 오름차순 정렬 후 반환될 위치의 인덱스를 사용해 답을 구했다. 입력받은 위치와 배열의 인덱스가 서로 다른 위치를 가르킨다는 것만 주의하면 쉽게 풀 수 있는 문제였다.

String substring(int beginIndex, int endIndex)
beginIndex의 위치에서부터 endIndex의 위치전까지의 문자열을 반환한다

예시)
0	1	2	3	4
안	녕	하	세	요

substr(0,2) 의 결과는 안녕
substr(2,4) 의 결과는 하세
substr(4,4) 의 결과는 요

나름 쉽고 간단하게 풀었는 줄 알았는데 다른 사람 풀이를 참고하니 조금만 더 생각했다면 불필요한 코드를 제거할 수 있었을텐데 아쉬움이 남았다. 그중 가장 간결했던 코드와 주요 함수이다. 풀이과정은 똑같은데 copyOfRange 함수를 사용해서 코드가 훨씬 간단했다.

public int[] solution(int[] array, int[][] commands) {
        int[] answer = new int[commands.length];

        for(int i=0; i<commands.length; i++){
            int[] temp = Arrays.copyOfRange(array, commands[i][0]-1, commands[i][1]);
            Arrays.sort(temp);
            answer[i] = temp[commands[i][2]-1];
        }

        return answer;
    }
copyOfRange (int [] original_array, int from_index, int to_index)
original_array 원본배열로부터 from_index부터 to_index까지를 복사한다.

좋은 웹페이지 즐겨찾기