문제 링크
https://codingdojang.com/scode/408
1차원의 점들이 주어졌을 때, 그 중 가장 거리가 짧은 점의 쌍을 출력하는 함수를 작성하시오(단, 점들의 배열은 모두 정렬되어있다고 가정한다.)
s=[1, 3, 4, 8, 13, 17, 20] 이라면 결과값은 [3,4]가 된다.
function solution(s) {
let ss = []
for(let i = 1; i < s.length; i++) {
ss.push(s[i] - s[i-1])
}
let minNum = Math.min(...ss)
let minIdx = ss.findIndex(el => el === minNum)
let answer = [s[minIdx], s[minIdx+1]]
console.log(answer)
}
[1, 3, 4, 8, 13, 17, 20]은 각각 1차원의 위에있는 점들이므로 각 점들 사이의 거리는
3 - 1 = 2
4 - 3 = 1
8 - 4 = 4
13 - 8 = 5
17 - 13 = 4
20 - 17 = 3 이 된다.
그러면 가장 작은 값이 나왔을 때가 두 점사이의 거리가 가장 짧은 점의 쌍인것이다.
ss = [2, 1, 4, 5, 4, 3]인 배열이라고 생각한다면
ss의 0번째 원소는 s의 1번째 원소 - s의 0번째 원소
ss의 1번째 원소는 s의 2번째 원소 - s의 1번째 원소
...
ss의 5번째 원소는 s의 6번째 원소 - s의 5번째 원소이다.
따라서 ss의 1번째 원소가 가장 작다는 것은
s의 2번째 원소 - s의 1번째 원소가 가장 작다는 것이다
ss의 인덱스가 s의 5번째 원소까지 대응되므로
answer = [s[1], s[2]]
function solution(s) {
let idx = 0
let min = Infinity
for(let i = 1; i < s.length; i++) {
if(s[i] - s[i-1] < min) {
min = s[i] - s[i-1]
idx = i
}
}
let answer = [s[idx-1], s[idx]]
console.log(answer)
}
이 풀이에서
let min = Infinity
for(let i = 1; i < s.length; i++) {
if(s[i] - s[i-1] < min) {
min = s[i] - s[i-1]
}
}
이 부분은 s[i] - s[i-1] < min 가 true 일때 min의 값을 s[i] - s[i-1]로 바꾼다.
이때 s = [1, 3, 4, 8, 13, 17, 20] 이면
min은 Infinity -> 2 -> 1 이렇게 변한다. 이렇게 min의 값이 변할 때
idx = i 로 해주면 min의 값이 최소일 때 인덱스를 구할 수 있다.
function solution(s) {
let ss = s.slice(1)
let answer = s.map((el, i) => [el, ss[i]]).sort((a, b) => {
return (a[1] - a[0]) - (b[1] - b[0])
})
console.log(answer)
}