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입니다.입출력 예
array commands return [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());