프로그래머스/Lv. 0(코딩테스트 입문)

[프로그래머스 코딩테스트] 특이한 정렬(Java)

Sigfriede 2023. 7. 17. 01:00

  문제 설명

  정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return 하도록 solution 함수를 완성해주세요.

 

  제한사항

  • 1 <= n <= 10,000
  • 1 <= numlist의 원소 <= 10,000
  • 1 <= numlist의 길이 <= 100
  • numlist는 중복된 원소를 갖지 않습니다.

 

  입출력 예

numlist n result
[1, 2, 3, 4, 5, 6] 4 [4, 5, 3, 6, 2, 1]
[10000, 20, 36, 47, 40, 6, 10, 7000] 30 [36, 40, 20, 47, 10, 6, 7000, 10000]
import java.util.Arrays;
class Solution {
    public int[] solution(int[] numlist, int n) {
        Integer[] numObjects = new Integer[numlist.length];
        for (int i = 0; i < numlist.length; i++) {
            numObjects[i] = numlist[i];
        }
        Arrays.sort(numObjects, (a, b) -> {
            int A = Math.abs(a - n);
            int B = Math.abs(b - n);
            if (A == B) {
                return Integer.compare(b, a);
            } else {
                return Integer.compare(A, B);
            }
        });
        int[] answer = new int[numlist.length];
        for (int i = 0; i < numlist.length; i++) {
            answer[i] = numObjects[i];
        }
        return answer;
    }
}

  Integer 타입의 배열 numObject를 생성합니다. Arrays 클래스의 sort는 객체 배열에서만 작동하기 때문입니다.

  for문이 numlist의 길이만큼 순회합니다.

  numObject의 i 번째 원소에 numlist의 i 번째 원소를 할당합니다.

  Arrays 클래스의 sort 메소드를 이용하여 numObject를 정렬합니다.

  변수 A와 B를 생성합니다. 각각 a - n의 절대값과 b - n의 절대값을 할당합니다. Math 클래스의 abs 메소드를 이용하여 절대값을 구할 수 있습니다.

  if문에서 A와 B가 같을 때, 즉 n에 대한 a와 b의 간격이 같다는 것을 의미합니다. 이때 compare 메소드를 이용하여 더 큰 값인 b를 기준으로 정렬합니다.

  앞선 조건에 해당하지 않으면 compare 메소드를 이용하여 간격이 더 적은 값을 기준으로 정렬합니다.

  다음은 정렬한 numObject 배열을 answer에 옮겨줄 차례입니다.

  for문이 numlist의 길이만큼 순회합니다.

  answer의 i 번째 원소에 numObject의 i 번째 원소를 할당합니다.

 

  형변환을 이리저리 하다보니 가독성도 떨어지고 비효율적이라는 생각도 듭니다. stream을 활용하는 법을 좀 더 배워야할 듯합니다.