본문 바로가기
알고리즘/프로그래머스

[카카오 알고리즘][정렬] K번째수 JAVA

by Jay Son 아기 냥이 해린 짱💖 2020. 9. 4.

난이도 : 하

출제 빈도 : 높음

평균 점수 : 높음

 

문제 전체 내용 : https://programmers.co.kr/learn/courses/30/lessons/42748?language=java

 

코딩테스트 연습 - K번째수

[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

programmers.co.kr

문제 요약

array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  3. 2에서 나온 배열의 3번째 숫자는 5입니다.

내코드

성능의 좋지만 코드 가독성이 떨어짐.

     /**
     * 테스트 1 〉	통과 (0.27ms, 69.2MB)
     * 테스트 2 〉	통과 (0.31ms, 69.8MB)
     * 테스트 3 〉	통과 (0.27ms, 69.2MB)
     * 테스트 4 〉	통과 (0.29ms, 68.6MB)
     * 테스트 5 〉	통과 (0.31ms, 70.2MB)
     * 테스트 6 〉	통과 (0.31ms, 69.2MB)
     * 테스트 7 〉	통과 (0.29ms, 70.4MB)
     */
    public static int[] KNumber(int[] array, int[][] commands) {
        int[] answer = new int[commands.length];

        for (int i = 0; i < commands.length; i++) {
            ArrayList<Integer> orgArrayList = new ArrayList<>();
            for (int k = commands[i][0]-1; k <= commands[i][1]-1;k++) {
                orgArrayList.add(array[k]);
            }

            Collections.sort(orgArrayList);
            answer[i] = orgArrayList.get(commands[i][2]-1);
        }

        return answer;
    }

 

카카오 제출 답안 가장 인기 있는 코드

가독성이 좋음.

coryOfRange API 활용이 잘되어 코드가 깔끔함.

coryOfRange API 사용하여 성능이 조금 떨어짐.

    /**
     * 테스트 1 〉	통과 (0.45ms, 69.6MB)
     * 테스트 2 〉	통과 (0.46ms, 69.6MB)
     * 테스트 3 〉	통과 (0.48ms, 70.8MB)
     * 테스트 4 〉	통과 (0.49ms, 68.5MB)
     * 테스트 5 〉	통과 (0.51ms, 70.4MB)
     * 테스트 6 〉	통과 (0.44ms, 70.3MB)
     * 테스트 7 〉	통과 (0.48ms, 70.5MB)
     *
     */
import java.util.Arrays;
class Solution {
    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;
    }
}

 

마무리

코드 가독성을 위해 아래와 같이 시작, 끝, 가져오기를 각 각 선언했으면 더 좋았을 것 같음.

// 기존 코드
for (int k = commands[i][0]-1; k <= commands[i][1]-1;k++) {
   ...
}

// 수정 코드
int start = commands[i][0] - 1;
int end = commands[i][1] - 1;
int pick = commands[i][2] - 1;

for (int k = start; k <= end; k++) {
    ...
}
반응형