[JAVA] K번째의 수

태히·2021년 1월 13일
1

코딩테스트 연습

목록 보기
2/9

문제 설명

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
예를 들어 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입니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

array의 길이는 1 이상 100 이하입니다.
array의 각 원소는 1 이상 100 이하입니다.
commands의 길이는 1 이상 50 이하입니다.
commands의 각 원소는 길이가 3입니다.

문제 이해하는데도 오래걸렸다

처음떠오른 생각

우선 2차원배열인 commands의 원소접근을 잘 생각해야겠고(물론 for문써서) --> for문을 써서 array인덱스 접근하고 --> 문제만 복잡하지 별거 없을듯...? 사망플레그

풀이

class Solution{
    public int[] solution(int[] array, int[][] commands) {
        int i,j,k;
        int x=commands.length;
        int[] tmp={};
        int[] answer = new int[x];

        for(int a=0; a<x; a++){
            int index=0;
            i=commands[a][0]-1;
            j=commands[a][1]-1;
            k=commands[a][2]-1;

            tmp = init_arr(i,j);//i에서 j만큼의 임시배열 생성함수 호출

            for(; i<=j; i++){
                tmp[index]=array[i];//tmp임시배열에 i부터 j까지 대입
                index++;
            }
            Arrays.sort(tmp);//tmp 오름차순으로 정렬

            answer[a]=tmp[k];//tmp k번째의 수를 answer에 대입
        }
        
        return answer;
    }
    public int[] init_arr(int a, int b){//임시배열 생성 후 반환
        int[] tmp = new int [b-a+1];
        for(int i=0; i<tmp.length; i++){
            tmp[i] = 0;
        }
        return tmp;
    }
}

내용은 이렇다.

변수 i,j,k를 선언해주고
i,j,k에 commands배열의 원소를 for문을 돌면서 각각 넣어준다.
init_arr()함수를 통해 임시배열을 i~j크기만큼 초기화 해주고 리턴.
array배열을 i~j만큼 잘라서 tmp 임시배열에 넣어준다.
Arrays.sort()함수를 통해 오름차순으로 정렬해준다.
마지막으로 정렬된 tmp배열의 k번째 수를 answer배열에 첫번째 인덱스에 넣어준다.
이 과정을 commands길이만큼 반복하고 완료된 answer배열을 반환한다.

REVIEW

문제를 풀어나가기 위해 생각을 해보니 배열을 복사하는것이 관건이라 생각했다. 하지만 라이브러리를 사용할 생각을 못했기 때문에 배열을 복사하기위한 임시배열을 초기화해주는 함수를 만들어서 구현해봤다.

하지만!! 이를 해결하기 위한 방법이 있었다.

  • 함수를 만들지 않고 배열을 초기화 할 수 있었다.
    -> for문안에서 선언이 안된다고 생각했다.(분명 오류가 떴었다...)
  • Arrays.copyOfRange(arr, 시작점, 마지막점+1) 함수 사용
    -> 배열복사를 간단히 할 수 있는 함수가 있었다.

후기

머리가 진짜 굳은거 같다. 또 자바를 오랜만에 해보는 거라 다른 언어랑도 헷갈리는 부분이 많이 있는것 같다. 또 알지 못하는 라이브러리 및 함수도 많아 공부를 더 해야겠다고 생각했다. 다른사람들이 푼 코드를 봤는데 라이브러리만 써서 간단하게 구현한 사람도 있고, 라이브러리 없이 순수하게 구현한 사람도 있었다. 라이브러리를 사용하는것이 좋네, 나쁘네 말이 많은데 둘 다 알고있으면 좋지 않은가?
이 라이브러리가 어떤 라이브러리이고 이걸 어떻게 구현하는지도 알고 있으면 좋을 것 같다.

GITHUB 주소 : k번재의 수_git

profile
하고싶은게 많은 개발자가 되고싶은

0개의 댓글