코딩 도장 LV2, 가장 거리가 짧은 점의 쌍

장성우·2023년 7월 9일

문제풀이

목록 보기
4/9

문제 링크
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]]

  • 다른 풀이1
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의 값이 최소일 때 인덱스를 구할 수 있다.

  • 다른 풀이2
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)
}
profile
HiHeLlo!1

0개의 댓글