[Algorithm] 프로그래머스_특이한 정렬(JAVA), 우선순위 큐, Comparator

2024. 12. 5. 23:27·Algorithm

https://school.programmers.co.kr/learn/courses/30/lessons/120880

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


이 문제의 접근은 n과 배열의 차이값을 구하자는 아이디어로부터 시작됐다.

[-3, -2, -1, 0, 1, 2] 이런 식으로 차이값이 들어있는 배열을 생성할 수 있을 것이다.

이후 우선순위 큐가 생각났고, 절대값으로 우선순위를 매기되 같은 값이면 양수가 우선순위가 되도록 설정하였다.

 

여기서 Comparator 반환값에 대해 맨날 헷갈려서 정리하려고 한다.

PriorityQueue는 내부적으로 Comparator 인터페이스를 사용하고

Comparator 인터페이스의 핵심 메서드가 바로 compare이다.

PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
    @Override
    public int compare(Integer a, Integer b) {
        ...
    }
});

중요한 키포인트💫

음수 첫번째 매개변수 a가 왼쪽에 와야함
0 동일하다.
양수 첫번째 매개변수 a가 오른쪽에 와야함

 

PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
    @Override
    public int compare(Integer a, Integer b) {
        return a-b;
    }
});

위와같이 a-b를 반환값으로 설정하면

a<b 일 때 음수가 되고 a,b 순으로 정렬되므로 오름차순이다.

 

만약 b-a라면?

PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
    @Override
    public int compare(Integer a, Integer b) {
        return b-a;
    }
});

b<a 일 때 음수가 되고 a,b 순으로 정렬되므로 내림차순이 되는 것이다!!

 

gpt한테 물어봐도 헷갈렸었는데 

https://blog.naver.com/gaussian37/220514246243

 

JAVA, Comparator 에서의 반환값

  int compare(Object left, Object right)일 때  리턴값 뜻  -1 결과적으로 left 가 왼...

blog.naver.com

이 분의 표를 보고 단 번에 이해했다. 감사합니다..

 

우선순위 큐로 정렬까지 했다면 각 배열의 원소 값에 n을 더해주면 정답이다.

 

아래는 정답소스⭕

import java.util.PriorityQueue;
class Solution {
    public int[] solution(int[] numlist, int n) {
        int[] answer = new int[numlist.length];
        int[] diff = new int[numlist.length];
        for(int i = 0; i < numlist.length; i++){
            diff[i] = numlist[i] - n;
        }
        
        PriorityQueue<Integer> pq = new PriorityQueue<>((a,b) -> {
            int absA = Math.abs(a);
            int absB = Math.abs(b);
            
            if(absA != absB){
                return absA - absB;
            }else{
                return a > b ? -1 : 1;
            }
        });
        
        for(int num : diff){
            pq.add(num);
        }
        
        int idx = 0;
        while(!pq.isEmpty()){
            answer[idx++] = pq.poll() + n;
        }
        
        return answer;
    }
}

 

 

'Algorithm' 카테고리의 다른 글

[Algorithm] 프로그래머스_네트워크(JAVA)  (0) 2024.12.11
[Algorithm] 프로그래머스_K번째수(JAVA)  (2) 2024.12.11
[Algorithm] 프로그래머스_올바른 괄호(JAVA)  (3) 2024.12.10
[Algorithm] 프로그래머스_타겟넘버(JAVA)  (3) 2024.12.10
[Algorithm] 프로그래머스_겹치는 선분의 길이(Java)  (0) 2024.12.05
'Algorithm' 카테고리의 다른 글
  • [Algorithm] 프로그래머스_K번째수(JAVA)
  • [Algorithm] 프로그래머스_올바른 괄호(JAVA)
  • [Algorithm] 프로그래머스_타겟넘버(JAVA)
  • [Algorithm] 프로그래머스_겹치는 선분의 길이(Java)
dev_ajrqkq
dev_ajrqkq
알고리즘 천재가 될 거야
  • dev_ajrqkq
    기록이 자산이다
    dev_ajrqkq
  • 전체
    오늘
    어제
    • 분류 전체보기 (146) N
      • Front-end (0)
      • Back-end (11)
        • Spring (1)
        • Java (8)
      • CS (9)
        • 데이터베이스 (5)
        • 네트워크 (4)
      • Algorithm (79) N
      • 이것저것 (0)
      • 버그잡기 (1)
      • TIL (37)
      • 후기 (1)
      • 취준 (0)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      Til
      TypeScript
      99클럽
      항해99
      코딩테스트준비
      티스토리챌린지
      오블완
      개발자취업
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    dev_ajrqkq
    [Algorithm] 프로그래머스_특이한 정렬(JAVA), 우선순위 큐, Comparator
    상단으로

    티스토리툴바