공부/알고리즘, 자료구조

[프로그래머스] K번째 수

오잎 클로버 2022. 2. 12. 08:30
728x90

 해당 문제의 링크는 여기입니다. 

다른 분들은 더 편하게 푸셨지만

제가 작성한 코드와 원리는 동일합니다.

 

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;
    }
}

위 코드는 다른 분들이 작성한 코드들 중 하나입니다.

public int[] solution(int[] array, int[][] commands) {
    int commandLength = commands.length;
    int[] answer = new int[commandLength];
    for (int i = 0; i < commandLength; i++) {
        int firstIndex = commands[i][0];
        int finalIndex = commands[i][1];
        int index = commands[i][2];
        if (firstIndex != finalIndex) {
            int[] temp = Arrays.copyOfRange(array, firstIndex - 1, finalIndex);
            Arrays.sort(temp);
            answer[i] = temp[index-1];
        }
        else {
            int temp = array[firstIndex-1];
            answer[i] = temp;
        }
    }

    return answer;
}

위 코드는 제가 작성하였습니다.

 

 

원리는 단순합니다.

배열을 주고, 해당 배열 i번째 ~ j번째까지 자른 후, 정렬을 한 뒤, k번째 수를 temp 배열에 저장합니다.

 

단, 이때 i와 k 는 -1를 해야합니다.

배열은 0부터 시작하므로 -1를 해야 원하는 위치를 조절할 수 있습니다.

 

copyOfRange 메소드는 깊은 복사를 하는 메소드입니다.

 

 

 

코딩테스트를 연습하시는 분들을 위한 짧은 글...

사람들마다 구현하는 방식에는 차이가 있지만

크게 3가지가 있다고 생각합니다.

  1. 라이브러리 및 내장 함수 사용하여 짧고 간결한 코드, 해당 내장 함수 모르면 사용 불가능
  2. 라이브러리 및 내장 함수 사용 ❌, 길지만 다른 언어에서도 충분히 적용 가능
  3. 가독성을 위해 내장 함수를 최대한 덜 사용

가독성은 언제나 중요하지만, 개인적으로 보았을 때, 내장 함수를 사용하는 분들이 많습니다.

아마 내장 함수가 없으면, 코드가 길어지고 지저분해지기 때문으로 보임

 

물론 어떻게 코딩테스트를 하든지간에 상관은 없지만, 제 개인적인 생각으로는

가독성과 내장 함수를 덜 사용하는 3번 방향이 제일 좋다고 생각합니다.

(사실, 어떻게든 해결하기만 해도 큰 문제는 없지만, 

해당 언어에 대해 자세히 배우고 쓰고 싶다면 1번, 단순 알고리즘은 2번, 1과 2번 합친 결과물: 3번)

 

 

이상입니다.