알고리즘 문제 풀이

[elice 알고리즘 코드 챌린지] Day 2 - 정리 정돈을 좋아하는 k씨

곰나루_ 2024. 7. 9. 23:23
import java.io.*;
import java.util.*;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());  // 배열 크기
        int m = Integer.parseInt(st.nextToken());  // k씨가 일한 횟수

        // 배열 입력
        int[] arr = new int[n + 1];
        st = new StringTokenizer(br.readLine());
        for(int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        // k씨 일 진행
        while (m-- > 0) {
            // 인덱스 값 입력받고 0-index로 변환
            st = new StringTokenizer(br.readLine());
            int i = Integer.parseInt(st.nextToken()) - 1;
            int j = Integer.parseInt(st.nextToken()) - 1;
            int k = Integer.parseInt(st.nextToken()) - 1;

            int[] newArr = Arrays.copyOfRange(arr, i, j + 1);  // i부터 j까지 복사
            Arrays.sort(newArr);

            sb.append(newArr[k] + "\n");
        }

        System.out.println(sb);
    }
}

 

1. 문제 요약

정리 정돈을 좋아하는 k씨가 주어진 배열의 특정 범위를 오름차순으로 정렬한 후, 해당 범위에서 k번째로 작은 숫자를 선택하는 작업을 여러 번 수행합니다. 입력으로 배열의 크기, k씨의 작업 횟수, 배열의 요소들, 그리고 각 작업의 범위와 k값이 주어집니다. 각 작업에 대해 k씨가 선택한 숫자를 출력합니다.

2. 핵심 아이디어

  1. 범위 추출 및 정렬:
    • 배열의 특정 범위를 추출하여 오름차순으로 정렬합니다.
    • 정렬된 배열에서 k번째 숫자를 선택합니다.
  2. 효율적인 배열 복사:
    • Arrays.copyOfRange 메서드를 사용하여 배열의 특정 범위를 복사합니다.
  3. 인덱스 조정:
    • 입력받은 인덱스를 0-index로 변환하여 사용합니다.

3. 참고 - Arrays 클래스의 주요 메서드

  • Arrays.copyOfRange(T[ ] original, int from, int to):
    • 지정된 범위의 원소를 포함하는 새로운 배열을 반환합니다.
    • from은 포함되지만 to는 포함되지 않습니다.
  • Arrays.sort(T[ ] arr):
    • 배열을 오름차순으로 정렬합니다.
  • Arrays.toString(T[ ] arr):
    • 배열의 내용을 문자열로 변환하여 반환합니다.