Algorithm/Programmers

Programmers / Level 1 / K번째수

Gyuri 2022. 6. 27. 20:24

[문제설명]

배열 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입니다.

[입출력 예]

array commands return
[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

 

import java.util.*;

class Solution {
    public int[] solution(int[] array, int[][] commands) {
        int start = 0;
        int end = 0;
        int num = 0;

        int[] answer = new int[commands.length];
        int cnt = 0;

        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < commands.length; i++) {
            list.removeAll(list);
            start = commands[i][0];
            end = commands[i][1];
            num = commands[i][2]-1;

            for (int j = start; j <= end; j++) {
                list.add(array[j-1]);
                Collections.sort(list);
            }
            answer[cnt++] = list.get(num);
        }

        return answer;
    }
}

 

i번째 숫자부터 j번째 숫자까지 자르고 정렬 후, k번째 수를 구해야하는데

commands 배열에서 주어진다.

 

start, end, num 변수를 생성했다. (각각 시작, 끝, k번째 수 나타냄)

 

ArrayList를 생성해, for문을 돌며 commands에서 start, end, num값을 알아내고

Array을 start부터 end까지 잘라 정렬했다.

정렬 후, answer배열에 num번째 수를 저장한다.

 

여기서 주의할 점은, 추가해주고 나면 list를 비워줘야 한다는 점이다.

list.removeList(list)를 통해 list를 비워준 후, 새롭게 start, end, num값을 알아내고 또 다시 정렬 후 num번째 수를 저장하는 걸 반복한다.

 


 

꽤 많은 사람이 푼 걸 보면 어려운 문제는 아닌듯 싶은 나는 시간이 꽤 오래걸렸다.. 

바로 코드를 짜기엔 복잡해서 디버깅도 많이 했는데, 프로그래머스 내에서 코드를 짤 땐 이렇게 하나하나 디버깅 해볼 수 없어서

연습을 많이 해야할 것 같다.