알고리즘 문제/프로그래머스
프로그래머스 0단계 특이한 정렬- java
가끔개발
2023. 5. 18. 14:30
문제 설명
정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ n ≤ 10,000
- 1 ≤ numlist의 원소 ≤ 10,000
- 1 ≤ numlist의 길이 ≤ 100
- numlist는 중복된 원소를 갖지 않습니다.
문제풀이 1
import java.util.*;
class Solution {
public int[] solution(int[] numlist, int n) {
// 거리와 원소를 저장하는 Map 생성
Map<Integer, Integer> distanceMap = new HashMap();
// 거리 계산 및 Map에 저장
for(int num: numlist){
int distance = Math.abs(num -n);
distanceMap.put(num, distance);
}
// 거리에 따라 오름차순으로 정렬 하고, 거리가 같으면 원소의 크기에 따라 내림차순으로 정렬
List<Integer> sortedList = new ArrayList<>(distanceMap.keySet());
sortedList.sort((a,b) ->{
int distanceA = distanceMap.get(a);
int distanceB = distanceMap.get(b);
if(distanceA == distanceB){
return b-a;
}else {
return distanceA - distanceB;
}
});
// 결과 배열 생성
int[] result = new int[sortedList.size()];
for(int i =0; i < sortedList.size(); i++){
result[i] = sortedList.get(i);
}
return result;
}
}
1. 거리와 원소를 저장하는 Map 생성
2. 거리 계산및 Map에서 저장
3. 거리에 따라 오름차순으로 정렬 하고 거리가 같으면 원소의 크기에 따라 내림차순으로 정렬
4. 결과 배열 반환
다른사람 문제풀이
import java.util.Arrays;
class Solution {
public int[] solution(int[] numList, int n) {
return Arrays.stream(numList)
.boxed()
.sorted((a, b) -> Math.abs(a - n) == Math.abs(b - n) ? b.compareTo(a) : Integer.compare(Math.abs(a - n), Math.abs(b - n)))
.mapToInt(Integer::intValue)
.toArray();
}
}
- Arrays.stream(numList): numList 배열을 스트림으로 변환합니다.
- .boxed(): int 형의 원소들을 Integer 객체로 박싱하여 스트림의 요소 타입을 Integer로 변경합니다.
- .sorted((a, b) -> ...): 정렬을 수행합니다. 정렬 기준은 주어진 람다식으로 작성되어 있습니다.
- Math.abs(a - n) == Math.abs(b - n): a와 b의 거리가 n으로부터의 거리가 같은 경우를 비교합니다.
- b.compareTo(a): 거리가 같을 경우에는 b와 a를 비교하여 내림차순으로 정렬합니다.
- Integer.compare(Math.abs(a - n), Math.abs(b - n)): 거리가 다를 경우에는 거리를 비교하여 오름차순으로 정렬합니다.
- .mapToInt(Integer::intValue): 정렬된 요소들을 int 형으로 변환하여 IntStream으로 변경합니다.
- .toArray(): IntStream을 int 배열로 변환하여 반환합니다.
따라서, 주어진 numList 배열의 원소를 n으로부터 가까운 순서로 정렬하여 결과를 반환하는 코드입니다.
https://school.programmers.co.kr/learn/courses/30/lessons/120880
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr