[JAVA/프로그래머스] 특이한 정렬

윤소영·2024년 3월 19일
0

JAVA

목록 보기
34/41

문제


특이한 정렬



문제 답안

import java.util.*;
class Solution {
    public int[] solution(int[] numlist, int n) {
        int[] answer = new int[numlist.length];
        int[] len = new int[numlist.length];
        Arrays.sort(numlist);
        for(int i = 0; i < numlist.length; i++){
            len[i] = Math.abs(numlist[i]-n);
        }
        Arrays.sort(len);
        int k = 0;
        for(int i = 0; i <len.length; i++){
            for(int j = numlist.length-1; j >= 0; j--){
                if(Math.abs(numlist[j]-n) == len[i]){
                    answer[k++] = numlist[j];
                    numlist[j] = n;
                    break;
                }
            }
        }
        return answer;
    }
}



답안 풀이

생각보다 시간이 걸렸고, 생각보다 갑자기(?) 해결된 문제

우선 해결해야하는 점을 생각해보면...

  • 절대값이 같은 숫자가 있으면 큰 숫자부터 출력해야한다!

이 한가지가 마음에 계속 걸리면서 풀었는데... 이를 어떻게 해결하고자 하였냐면 일단 numlist를 정렬해주었다. 그리고 for문을 거꾸로 돌리면서 큰 숫자를 먼저 넣는 식으로!

  1. numlist를 정렬한다.(거리가 같을 때 큰 숫자를 먼저 넣기 위해)
  2. 절대값(거리)을 구해 len 배열에다 넣는다.
  3. len을 정렬한다.(가장 가까운 숫자를 먼저 넣기 위해)
  4. len 배열과 numlist 배열을 비교해주면서, 정렬된 numlist의 절댓값이 len 과 같아지면 그 numlist 값을 answer에 넣고 넣은 numlist 값은 필요없는 garbage 값을 넣어준다.(필자는 n을 택했다!) 그리고 더 이상 for문을 안돌리게 break 해주었다

4번에서 break를 안해준다거나 numlist에 garbage 값을 안넣어주면 런타임에러가 나고 오류가 난다.

번외로 numlist를 내림차순 정렬을 해주려고 찾아봤으나 Collections.reverseOrder()이 있는데 이는 int, double, float과 같은 primitive type에는 쓸 수가 없다.
Integer, String과 같은 것에만 쓸 수 있다. 최대한 문제에서 주어진 타입 같은건 안건들이고 싶어서 필자는 쓰지 않았다.

0개의 댓글