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

🚨문제 설명

💡푼 방법

import java.util.*;

class Solution {
    public int[] solution(int[] array, int[][] commands) {

        ArrayList<Integer> list = new ArrayList<>();
        
        for(int i = 0; i < commands.length; i++){
        
            ArrayList<Integer> set = new ArrayList<>();

            for(int k = (commands[i][0])-1; k < commands[i][1]; k++){
                set.add(array[k]);
            }
            set.sort(Comparator.naturalOrder());
            list.add(set.get((commands[i][2])-1));            
        }
        
        int[] answer = new int[list.size()];

        for(int n = 0; n < list.size(); n++){
            answer[n] = list.get(n);
        }
        
        return answer;
    }
}

command 배열을 돌면서 배열 안에 들어있는 조건에 맞춰 수를 set에 더해주고 set을 기본 오름차순으로 정렬(Comparator.naturalOrder())한 후 command에 들어있는 마지막 조건에 해당하는 수를 list에 더해준다.

*일반배열에서는 Arrays.sort(배열이름)을 사용하지만 Collections에서는 리스트.sort(정렬규칙(Comparator.naturalOrder()))로 작성한다.

 

command에 들어있는 조건들이 0부터시작하는 것이 아닌 1부터 시작하는 조건이어서 for문을 돌 때 -1을 해주었다.

answer의 길이를 list 사이즈로 정해주고 answer에 하나씩 넣어주었다.

 

내가 생각하기에는 나름에 괜찮다는 생각이 들면서 뭔가 더 깔끔하게 할 수 있을 것 같다는 느낌이 들었다.

문제는 풀렸지만 어떤 것을 이용하면 더 깔끔하게 만들 수 있을지 고민해봐야겠다고 생각했다.

 

*ArrayList에 넣을 때는 .add()를 쓰지만 리스트에 들어있는 것을 가져올 때는 .get()을 사용하는 걸 잊지말자!

🚧오답 노트

이 문제는 굳이 ArrayList를 사용할 필요없이 배열을 이용해도 괜찮은 문제였다.

이전 문제에서 ArrayList를 사용했기때문에 응용해보고 싶어 사용해보았다.

import java.util.*;

class Solution {
    public int[] solution(int[] array, int[][] commands) {
    	//answer의 길이를 미리 알 수 있기 때문에 먼저 선언하기
        int[] answer = new int[commands.length];

        for (int i = 0; i < commands.length; i++) {
            // 1. 범위만큼 배열을 잘라냅니다.
            int start = commands[i][0] - 1;
            int end = commands[i][1];
            int[] temp = Arrays.copyOfRange(array, start, end);
            
            // 2. 잘라낸 배열을 정렬합니다.
            Arrays.sort(temp);
            
            // 3. K번째(인덱스는 -1) 값을 결과 배열에 담습니다.
            answer[i] = temp[commands[i][2] - 1];
        }
        
        return answer;
    }
}

하지만 조금 더 간결하게하기 위해서는 배열을 사용하는 편이 좋다.

추가적으로 배열을 사용할 때와 ArrayList를 사용할 때에 대해서 공부하면 좋을 것 같다.

Arrays.copyOfRange(원본배열, 시작인덱스, 마지막인덱스)

내가 풀 때 ArrayList를 새로 만들고 거기에 넣어서 정렬을 했다면

이 코드는 원본배열과 시작인덱스, 마지막인덱스를 넣으면 그 구간을 새로운 배열로 만든다.

*주의할 점은 마지막인덱스는 포함되지 않으므로 그 인덱스를 포함시키고싶다면 +1을 해주어야한다.

 

그 이후 Arrays.sort(temp)로 정렬해준다.

 

나 같은 경우는 for문이 여러번 돌아가 클린하지 않은 코드였지만 이렇게 for문 한번으로 돌아가면 보기 쉽고 깨끗한 코드를 만들 수 있기 때문에 알아두면 좋다.