정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ n ≤ 10,000
- 1 ≤ numlist의 원소 ≤ 10,000
- 1 ≤ numlist의 길이 ≤ 100
- numlist는 중복된 원소를 갖지 않습니다.
입출력 예numlistnresult
[1, 2, 3, 4, 5, 6] | 4 | [4, 5, 3, 6, 2, 1] |
[10000,20,36,47,40,6,10,7000] | 30 | [36, 40, 20, 47, 10, 6, 7000, 10000] |
입출력 예 설명
입출력 예 #1
- 4에서 가까운 순으로 [4, 5, 3, 6, 2, 1]을 return합니다.
- 3과 5는 거리가 같으므로 더 큰 5가 앞에 와야 합니다.
- 2와 6은 거리가 같으므로 더 큰 6이 앞에 와야 합니다.
입출력 예 #2
- 30에서 가까운 순으로 [36, 40, 20, 47, 10, 6, 7000, 10000]을 return합니다.
- 20과 40은 거리가 같으므로 더 큰 40이 앞에 와야 합니다.
<설계>
answer[0]이 처음부터 n보다 작은 값이라면?
-> n과 가장 가까운 값이 음수배열에 있는지 양수배열에 있는지부터 파악해준다.
모든 값에 n을 뺀다.
절댓값 씌운 뒤에 순서대로 정렬. [1,1,2,3,3]
가장 작은 앞의 값을 기준으로 삼는다.anwer[0]로 삼는다.(+를 곱하고 n을 더해준다.)
(그럼 같은 거리의 뒤의 값은여? 있다면 answer[1]로 삼는다.(-를 곱하고 n을 더해준다. )
answer[0]값을 기준으로 작은 값과 큰값들의 배열 각각을 만든다.
뺀상태?
뺀상태에서 서로의 배열에 같은 값이 있는가 확인.
절댓값 같은게 없다면 각 배열에서 절댓값을 비교해가면서 작은 배열에서 뽑아냈다면 -를 곱하고 n더하기 / 큰 배열에서 뽑았으면 +를 곱하고 n더하기
절댓값 같은게 있다면 뒷배열에서 먼저 뽑아내기.
answer에 차곡차곡 나열하기.
출력.
마지막 반복문에서 원하는 값을 빼주고, 다시 그 작은 배열 값에서 내가 빼준값이 속한 배열을 찾아 빼줘야 하는데
그걸 구현 못해서 포기.
일단 애시당초 코드가 너무 길다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
function solution(numlist, n) {
let answer = [];
let sortArr =[];
let minusArr =[];
let plusArr =[];
let standard = 0;
for(let num of numlist){
sortArr.push(Math.abs(num-n))
if(num < n){
minusArr.push(num -n)
}else{
plusArr.push(num -n)
}
}
sortArr.sort((a,b)=> a-b)
minusArr.sort((a,b)=> a-b)
plusArr.sort((a,b)=> a-b)
if(minusArr.indexOf(`${sortArr[0]}`) !== -1){
// n과 가장 가까운 값이 n보다 작은 값이라면? 다시 음수로 되돌리고 n을 더한다.
standard = sortArr[0] * -1 + n
minusArr.shift()// answer에 준 만큼 줄이기
}else {
standard = sortArr[0] + n
plusArr.shift() // answer에 준 만큼 줄이기
}
answer.push(standard)
if(sortArr[0] === sortArr[1]){
sortArr[1] = sortArr[1] * -1 + n
answer.push(sortArr[1])
minusArr.shift() // n보다 작은 값들의 배열에서, 가장 n과 가까운 값을 빼줌.
}
// 여기까지 standard의 위치파악
// for(let num of numlist){
// }
for(let i=0; i<numlist.length; i++){
let new_num = Math.min(minusArr[0],plusArr[0])
answer.push(new_num)
if(minusArr[0]. )
}
|
cs |
<정답>
다들 함수 안에 함수를 쓰는 이 생각해내기도 어려운 것들을 써내는... wow.
난 알고리즘 합병정렬에서야 이 상수 안의 배열 방식을 맛보기로 만나봤을 뿐인데..(당연히 생각은 해내도 써먹지 못함.)
다들 정말 다 스스로 번뜩여서 푼것일까?
답을 배낀걸까?
뭐가 됬든 내 부족함만이 보일뿐이니 열심히 해야겠다.
function solution(numlist, n) {
let result = []
result = numlist.sort((a, b) => {
const [numA, numB] = [Math.abs(a - n), Math.abs(b - n)];
if(numA === numB){
return b - a;
}
return numA - numB;
})
return result;
}
'🗃️javascript > 프로그래머스' 카테고리의 다른 글
n 번째 원소까지(Lv.0)[다시 코테연습 시작] (0) | 2023.06.09 |
---|---|
문자열 밀기(Lv.0) (0) | 2023.04.10 |
최소직사각형(Lv.1) (0) | 2023.04.06 |
삼총사(Lv.1)[변수 선언은 최대한 적게.] (0) | 2023.04.06 |
시저 암호(Lv.1)[아스키 코드 범위 대문자 ㅡ> 소문자 사이에 값 있음 ] (0) | 2023.04.04 |