πŸ… ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 120875 : 평행 - Javascript

문제 μ„€λͺ…

점 λ„€ 개의 μ’Œν‘œλ₯Ό 담은 이차원 λ°°μ—΄ dotsκ°€ λ‹€μŒκ³Ό 같이 λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€.

  • [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]

주어진 λ„€ 개의 점을 두 κ°œμ”© μ΄μ—ˆμ„ λ•Œ, 두 직선이 평행이 λ˜λŠ” κ²½μš°κ°€ 있으면 1을 μ—†μœΌλ©΄ 0을 return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄λ³΄μ„Έμš”.


μ œν•œμ‚¬ν•­

  • dots의 길이 = 4
  • dots의 μ›μ†ŒλŠ” [x, y] ν˜•νƒœμ΄λ©° x, yλŠ” μ •μˆ˜μž…λ‹ˆλ‹€.
    • 0 ≀ x, y ≀ 100
  • μ„œλ‘œ λ‹€λ₯Έ λ‘κ°œ μ΄μƒμ˜ 점이 κ²ΉμΉ˜λŠ” κ²½μš°λŠ” μ—†μŠ΅λ‹ˆλ‹€.
  • 두 직선이 κ²ΉμΉ˜λŠ” 경우(μΌμΉ˜ν•˜λŠ” 경우)에도 1을 return ν•΄μ£Όμ„Έμš”.
  • μž„μ˜μ˜ 두 점을 이은 직선이 xμΆ• λ˜λŠ” yμΆ•κ³Ό ν‰ν–‰ν•œ κ²½μš°λŠ” 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

dots result
[[1, 4], [9, 2], [3, 8], [11, 6]] 1
[[3, 5], [4, 1], [2, 4], [5, 10]] 0
  • 예제 #1
    점 [1, 4], [3, 8]을 μž‡κ³  [9, 2], [11, 6]λ₯Ό 이으면 두 선뢄은 ν‰ν–‰ν•©λ‹ˆλ‹€.

  • 예제 #2
    점을 μ–΄λ–»κ²Œ 연결해도 ν‰ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.


풀이 κ³Όμ •

λ¨Όμ € 주어진 4개의 점을 a, b, c, d라고 ν•˜λ©΄ 두 점씩 μž‡λŠ” 방법은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

  • [a, b], [c, d]
  • [a, c], [b, d]
  • [a, d], [b, c]

이 μ™Έμ—λŠ” 두 점씩 λ¬ΆλŠ” 방법이 μ—†κΈ° λ•Œλ¬Έμ— 이 3가지 경우 쀑 ν•˜λ‚˜λΌλ„ 두 선이 ν‰ν–‰ν•˜λ©΄ 1을 λ°˜ν™˜ν•˜λ©΄ λ©λ‹ˆλ‹€. 두 μ„ μ˜ κΈ°μšΈκΈ°κ°€ κ°™μœΌλ©΄ ν‰ν–‰ν•œ 것이기 λ•Œλ¬Έμ— 점으둜 λ§Œλ“€μ–΄μ§„ μ§μ„ μ˜ 기울기λ₯Ό κ΅¬ν•΄μ„œ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.

function solution(dots) {
  //두 점의 μΈλ±μŠ€κ°€ 주어지면 두점을 이은 μ§μ„ μ˜ 각도λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
  const angle = (a, b) => (dots[a][0] - dots[b][0]) / (dots[a][1] - dots[b][1]);

  //직선을 λ§Œλ“€ 수 μžˆλŠ” λͺ¨λ“  방법을 인덱슀둜 ν‘œν˜„ν•˜κ³ , λͺ¨λ‘ 확인
  for (const [a1, b1, a2, b2] of [
    [0, 1, 2, 3],
    [0, 2, 1, 3],
    [0, 3, 1, 2]
  ]) {
    //λ§Œμ•½ 두 μ§μ„ μ˜ 각도가 κ°™λ‹€λ©΄ 1을 λ°˜ν™˜
    if (angle(a1, b1) === angle(a2, b2)) {
      return 1;
    }
  }

  //두 μ§μ„ μ˜ 각도가 같은 쑰합이 μ—†λŠ” 경우 0을 λ°˜ν™˜
  return 0;
}

μ½”λ“œ κ°œμ„ 

dots 인자 자체λ₯Ό 풀이와 λ™μΌν•˜κ²Œ a,b,c,d둜 λ°›μœΌλ©΄ μ „λ°˜μ μΈ μ½”λ“œλ₯Ό 더 κ°„λ‹¨ν•˜κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

//두 점을 이은 μ§μ„ μ˜ 각도λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
const angle = (a, b) => (a[0] - b[0]) / (a[1] - b[1]);

function solution([a, b, c, d]) {
  //직선을 λ§Œλ“€ 수 μžˆλŠ” λͺ¨λ“  방법을 확인
  for (const [a1, b1, a2, b2] of [
    [a, b, c, d],
    [a, c, b, d],
    [a, d, b, c]
  ]) {
    //λ§Œμ•½ 두 μ§μ„ μ˜ 각도가 κ°™λ‹€λ©΄ 1을 λ°˜ν™˜
    if (angle(a1, b1) === angle(a2, b2)) {
      return 1;
    }
  }

  //두 μ§μ„ μ˜ 각도가 같은 쑰합이 μ—†λŠ” 경우 0을 λ°˜ν™˜
  return 0;
}