<문제 제시>
<문제설명>
정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다.
이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다.
정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를
n으로부터 가까운 순서대로 정렬한 배열을 ( = 각 숫자에서 n을 뺀 절대값)
return하도록 solution 함수를 완성해주세요.
n으로부터 가까운 순서대로 정렬한 배열 ( = 각 숫자에서 n을 뺀 절대값)
<예시 입출력>
<문제 해결 과정>
기준 값 N이 주어지면 그 값을 기준으로 가까운 순으로 "순위"를 매겨 return해야한다.
이 또한 Search(탐색)문제 인 것 같았다.
Try 1)
int[] answer = {};
List<Integer> temp = new ArrayList<>();
// numlist에서 n이 속하는 인덱스를 찾는다.
int target = 0;
for(int i = 0; i < numlist.length; i++) {
if(numlist[i] == n) {
target = i;
}
}
// 원소가 6개 채워지면 반복문 종료
while(temp.size() < 6) {
// 찾은 값이 맨 끝 값이 아니면,
if(target != (numlist.length - 1)) {
}
}
return answer;
오답이 발생하였고, while문 안 조건문이 무분별하게 길어질 것 같아 효율적인 코드를 찾아야겠다고 생각
Solution 1)
향상된 for문 사용과 람다식 사용으로 리스트를 비교 및 정렬하고자하였다.
// 리스트를 비교 및 정렬
nums.sort((s1, s2) -> Integer.compare(Math.abs(s2 - n), Math.abs(s1 - n)));
// 리스트를 역정렬
Collections.reverse(nums);
//System.out.println(nums);
// answer를 반환하지 않고 리스트에서 stream()을 이용해 바로 반환
return nums.stream().mapToInt(num -> num).toArray();
인자 s1, s2를 익명으로 두고 정수형으로 비교를 하면서 n에서 가까운 값을 찾기 위해 부호 상관없이(Math.abs())
거리를 구한다.
리스트 역정렬 후 stream()클래스로 Map구조를 정수형으로 반환해 Array배열로써 반환한다.
<전체코드>
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class unique_sort {
public static int[] solution(int[] numlist, int n) {
List<Integer> nums = new ArrayList<>();
// 기존 데이터를 '오름차순 정렬'
Arrays.sort(numlist);
//System.out.println(Arrays.toString(numlist)); // 1, 2, 3, 4, 5, 6
// numlist의 숫자들을 리스트에 대입
for (int num : numlist) nums.add(num);
//System.out.println(nums); // 1, 2, 3, 4, 5, 6
// 리스트를 비교 및 정렬
nums.sort((s1, s2) -> Integer.compare(Math.abs(s2 - n), Math.abs(s1 - n)));
// 리스트를 역정렬
Collections.reverse(nums);
//System.out.println(nums);
// answer를 반환하지 않고 리스트에서 stream()을 이용해 바로 반환
return nums.stream().mapToInt(num -> num).toArray();
}
public static void main(String[] args) {
int[] numlist = {1, 2, 3, 4, 5, 6};
int n = 4;
System.out.println(Arrays.toString(solution(numlist, n)));
// 예상결과값
// [4, 5, 3, 6, 2, 1]
}
}
리스트를 정렬하는 부분인 Collections.reverse(nums)와 람다식 사용부분, stream()클래스 사용 부분이 코드를 효율적으로 만들고 바로 떠올리기 힘든 로직이었다.
잘 작동하는지 테스트하기위해 메인함수에
unique_sort unique_sort = new unique_sort();
String output1 = Arrays.toString(unique_sort.solution(new int[]{1, 2, 3, 4, 5, 6}, 4));
System.out.println(output1 + " " + output1.equals("[4, 5, 3, 6, 2, 1]"));
String output2 = Arrays.toString(unique_sort.solution(new int[]{10000, 20, 36, 47, 40, 6, 10, 7000}, 30));
System.out.println(output2 + " " + output2.equals("[36, 40, 20, 47, 10, 6, 7000, 10000]"));
String output3 = Arrays.toString(unique_sort.solution(new int[]{10,9,8,7,6,5,4,3,2,1,11}, 6));
System.out.println(output3 + " " + output3.equals("[6, 7, 5, 8, 4, 9, 3, 10, 2, 11, 1]"));
처럼 테스트케이스를 넣어 정상작동함을 확인할 수 있었다.
stream()클래스의 자연스러운 사용과 필요시 람다식의 사용또한 더 공부해야겠다고 느꼈다.
문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120880
'Algorithms > 프로그래머스' 카테고리의 다른 글
[프로그래머스] '문자열 밀기' - Java (0) | 2023.07.14 |
---|---|
[프로그래머스] '로그인 성공?' - Java (0) | 2023.07.13 |
[프로그래머스] '등수 매기기' - Java (0) | 2023.07.12 |
[프로그래머스] '유한소수 판별하기' - Java (0) | 2023.07.12 |
[프로그래머스] '달리기 경주' - Java (0) | 2023.05.21 |