[프로그래머스]_Lv1_K번째수 by Java

TONYLEE·2022년 8월 15일
0

프로그래머스_lv1

목록 보기
1/3

2022/08/15

문제

프로그래머스_lv1 K번째수 구하기 Java

🌈 문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/42748


👨‍💻 첫인상

처음 문제를 읽었을 때는, '엄청 쉬운 문제다!' 라는 생각을 했었는데 막상 풀어보니 생각보다 조금 시간이 걸렸다. 알고보니, 코딩테스트를 제대로 만져본 지 2년만 이었다. 원래는 c나 c++로 문제를 풀었었는데 JAVA로 코딩테스트를 하려니, 라이브러리도 잘 모르고 기본적인 문법에서 많이 헷갈려서 조금 힘들었다.

📖 문제

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면
array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
2에서 나온 배열의 3번째 숫자는 5입니다.

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

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

입출력 예

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

입출력 예 설명

[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.
[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.
[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.


😵‍💫 풀이

주어진 array 배열에서 first부터 last까지 배열을 잘라서 정렬한 다음, K번째를 구하면 된다.

commands 배열의 row수 만큼 반복을 처리하고 반복할 때마다 정렬할 값이 들어갈 배열[sortArray]와 commands 배열 내의 숫자를 담을 변수들(first,last,target)을 매번 초기화 한다.
sortArray 배열에 array 배열의 first부터 last까지 범위를 잘라서 넣어준 다음 sortArray 배열을 정렬시켜준다.
그리고 target자리에 들어가있는 값을 answer 배열에 대입해준다.


✍ 나의코드

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

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

            int[] sortArray ;

            int first = 0 ; // 첫번째 자리
            int last  = 0 ; // 마지막 자리
            int target = 0 ; // 목표자리

            first  = commands[i][0] -1;
            last   = commands[i][1];
            target = commands[i][2] -1;

            sortArray= new int[last-first];

            int num = 0; //정렬될 배열의 자리수

            for(int j = first ; j < last ; j++ )
            {
                sortArray[num] = array[j];
                num++;
            }

            for(int k = 0 ; k < sortArray.length ; k++)
            {
                for(int m = k+1; m < sortArray.length; m++)
                {
                    if(sortArray[k]>sortArray[m])
                    {
                        int tmp ;
                        tmp= sortArray[k];
                        sortArray[k] = sortArray[m];
                        sortArray[m] = tmp;
                    }
                }
            }

            answer[i] = sortArray[target];

        }

        return answer;
    }
}

👍 다른 사람의 풀이

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

🧐 배운 점

나의 Java 라이브러리의 무지에 대해서 깨달아 버렸다.
하지만 라이브러리를 가져다 쓰는것도 중요하지만, 풀어서 쓰는 것도 중요하다고 생각한다. 알고 쓰는것과 모르고 쓰는것은 천지차이다.

  • copyOf
    Arrays.copyOf(orgArray,복사할 길이)
    orgArray의 처음부터 길이까지 값을 반환

  • copyOfRange
    Arrays.copyOfRange(orgArray,start,end)
    orgArray에서 start부터 end 까지 복사해서 값을 반환

  • sort
    Array.sort(orgArray)

    sort 메소드를 이용하면 오름차순,내림차순으로 정렬가능하다
    default는 오름차순이고 내림차순 정렬은 다음과 같다.

    Array.sort(orgArray, Collections.reverseOrder());

profile
Comfortable Developer

0개의 댓글