[프로그래머스/알고리즘 고득점 Kit/JAVA] 정렬

2024. 9. 18. 01:16코딩 테스트(Coding Test)/프로그래머스

K번째수

나의 답)

import java.util.*;
class Solution {
    public int[] solution(int[] array, int[][] commands) {
        int[] ans = new int[commands.length];
        
        for (int i = 0; i < commands.length; i++) {
            int start = commands[i][0] - 1;
            int end = commands[i][1];
            int k = commands[i][2] - 1;
            
            int[] temp = Arrays.copyOfRange(array, start, end);
            Arrays.sort(temp);
            
            ans[i] += temp[k];
        }
        
        return ans;
    }
}
// commands[i]번 반복
// 배열 i ~ j 자르기
// 정렬하기
// k번째 수 출력

 

* Arrays.copyOfRange( 원본 배열, 복사하려는 시작 요소의 인덱스, 복사하려는 마지막 요소의 인덱스의 바로 다음 인덱스)

: 특정 배열의 원하는 범위만큼 복사하여 새로운 배열을 만드는 메소드


가장 큰 수

나의 답)

import java.util.*;
class Solution {
    public String solution(int[] numbers) {
        // int 배열을 String 배열로 변환
        String[] strNums = new String[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            strNums[i] = String.valueOf(numbers[i]);
        }
        
        // 두 숫자를 이어 붙였을 때 더 큰 순서대로 정렬
        Arrays.sort(strNums, (a, b) -> (b + a).compareTo(a + b));
        
        // 정렬된 값이 모두 "0"일 경우 "0" 반환
        if (strNums[0].equals("0")) return "0";
        
        // 정렬된 숫자를 순서대로 이어 붙여 가장 큰 수 생성
        StringBuilder sb = new StringBuilder();
        for (String n : strNums) {
            sb.append(n);
        }
        
        return sb.toString();
    }
}

 

문자열 비교를 통한 정렬

Arrays.sort(strNums, (a, b) -> (b + a).compareTo(a + b));
  • 각 문자열 a, b를 이어 붙였을 때 어떤 조합(b + a vs a + b)이 더 큰지를 비교하여 내림차순으로 정렬한다.
  • 예를 들어, a = "3", b = "30"일 경우:
    • b + a = "303"
    • a + b = "330"
    • 330이 더 크기 때문에 a가 앞에 와야 한다.
  • 두 숫자를 이어 붙였을 때 더 큰 순서를 먼저 나오도록 정렬하여, 최종적으로 배열을 이어 붙였을 때 가장 큰 수를 만들 수 있다.

H-Index

나의 답)

import java.util.Arrays;
class Solution {
    public int solution(int[] citations) {
        Arrays.sort(citations); // 인용 횟수를 정렬
        int n = citations.length;
        
        for (int i = 0; i < n; i++) {
            int h = n - i; // 현재 h는 남은 논문 수
            if (citations[i] >= h) {
                return h; // 조건을 만족하는 최댓값을 찾으면 반환
            }
        }
        
        return 0; // H=Index를 찾지 못한 경우 0 반환
    }
}