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

Boknami·2023년 7월 31일
0

프로그래머스

목록 보기
10/29

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

🕐 풀이 시간 : 35분 정도

🌄시행착오

처음에 이 문제에서 집중한 부분이 n과 같은 거리로 같게 되더라도 더 큰 숫자를 먼저 집어넣어야 한다는 부분이었다.

이를 위해서 생각했던 게 일단 정렬을 먼저 하고 뒤에서부터 차이를 계산해서 넣으면 쉽게 풀릴거라고 생각했다. 그러나 이렇게 문제를 풀다가보니 이미 넣었던 숫자는 어떻게 판별하느냐가 중요해보였다. 그래서 이 방식대로 문제를 쭉 해설하다가 다른 방식으로 변경했다.

💡아이디어

역시나 이미 넣었던 수를 가장 쉽게 제거하는 방법은 remove이기에 리스트를 사용했다.
이 때 조심해야할 부분이 remove는 무조건 인덱스를 제거한다!!
그렇기에 제거 시에는 Integer.valueOf()를 이용해서 원하는 인덱스를 찾고 제거하는 것이 옳다.

핵심 아이디어
1. 초기 numlist의 길이만큼 반복문을 돌면서
2. 현재 가장 작은 차이라고 생각되는 것을 계속 갱신하며 가장 n에 가까운 수를 찾는다.
2.1이 때 n과 거리가 같은 경우에는 더 큰 숫자를 집어 넣는다.
3. 반복문에 끝까지 이동 후에는 지금까지 n과 가장 가까운 수를 넣는다.
4. 넣은 수를 제거, 정답에 add 하고 2번으로 돌아간다.

⛳ 코드

import java.util.*;
class Solution {
    public List solution(int[] numlist, int n) {
        List<Integer> list = new ArrayList<>();
        List<Integer> answer = new ArrayList<>();
        for (Integer num : numlist) list.add(num);
        
        int len = list.size();
        for(int j = 0 ; j <  len; j++){
            int minDif = 10000;
            int minNum = 0;
            
            for(int i = 0 ; i < list.size() ; i++){
                if(Math.abs(minDif) > Math.abs(list.get(i) - n)){
                    minNum = list.get(i);
                    minDif = Math.abs(list.get(i) - n);
                }
                else if(Math.abs(minDif) == Math.abs(list.get(i) - n)){
                    System.out.println("list.get(i)");
                    if(minNum < list.get(i)) minNum = list.get(i);
                }
            }
            answer.add(minNum);
            list.remove(Integer.valueOf(minNum));
        }
        return answer;
    }
}

2개의 댓글

comment-user-thumbnail
2023년 7월 31일

좋은 글 감사합니다.

1개의 답글

관련 채용 정보