avatar
Published on

Codility - Number of Disc Intersections

Author
  • avatar
    Name
    yceffort

Number of Disc Intersections

문제

N개의 λ””μŠ€ν¬κ°€ μ‘΄μž¬ν•˜κ³ , λ””μŠ€ν¬λŠ” 각각 0~ N-1의 번호λ₯Ό κ°€μ§„λ‹€. μ΄λŠ” AλΌλŠ” λ°°μ—΄μ—μ„œ ν‘œν˜„λ˜λŠ”λ°, A[N] λŠ” ν•΄λ‹Ή λ””μŠ€ν¬μ˜ λ°˜κ²½μ„ μ˜λ―Έν•œλ‹€.

A[0] = 1
A[1] = 5
A[2] = 2
A[3] = 1
A[4] = 4
A[5] = 0

https://codility-frontend-prod.s3.amazonaws.com/media/task_static/number_of_disc_intersections/static/images/auto/0eed8918b13a735f4e396c9a87182a38.png

이 λ•Œ, κ΅μ°¨ν•˜λŠ” λ””μŠ€ν¬μ˜ 수λ₯Ό κ΅¬ν•˜λΌ.

풀이

function solution(A) {
  const length = A.length
  let intersections = 0

  // μ‹œμž‘ 점과 끝점을 μ €μž₯ν•˜λŠ” μƒˆλ‘œμš΄ 배열을 λ§Œλ“ λ‹€.
  // [ [ -1, 1 ], [ -4, 6 ], [ 0, 4 ], [ 2, 4 ], [ 0, 8 ], [ 5, 5 ] ]
  const info = A.map((disc, index) => [index - disc, index + disc])

  // 이λ₯Ό μ‹œμž‘μ μ΄ μž‘μ€ μˆœλŒ€λ‘œ λ°°μ—΄ν•œλ‹€.
  // [ [ -4, 6 ], [ -1, 1 ], [ 0, 4 ], [ 0, 8 ], [ 2, 4 ], [ 5, 5 ] ]
  const sorted = info.sort((a, b) => a[0] - b[0])

  // κ°€μž₯ λ°”κΉ₯에 μžˆλŠ” 원뢀터 λˆλ‹€
  for (let i = 0; i < sorted.length; i++) {
    // const targetStart = sorted[i][0]
    const targetEnd = sorted[i][1]

    // κ·Έ λ‹€μŒ 것 λΆ€ν„° λˆλ‹€
    for (let j = i + 1; j < sorted.length; j++) {
      const compareStart = sorted[j][0]
      // const compareEnd = sorted[j][1]

      // κ²ΉμΉ˜λŠ” κ²½μš°μ—λ§Œ
      if (compareStart <= targetEnd) {
        intersections += 1
        // κ²ΉμΉ˜λŠ” νšŸμˆ˜κ°€ νŠΉμ • 횟수λ₯Ό λ„˜μ–΄κ°€λ©΄ -1을 λ¦¬ν„΄ν•˜λžœλ‹€.
        if (intersections > 10000000) {
          return -1
        }
      } else {
        // μ‹œμž‘μ  순으둜 μ •λ ¬ν–ˆμœΌλ―€λ‘œ, 이 μ΄ν›„λŠ” μ•ˆλ΄λ„ μ•ˆκ²ΉμΉœλ‹€. λ”°λΌμ„œ break
        break
      }
    }
  }

  return intersections
}

ν•˜λ‚˜μ”© κ³ λ―Όν•΄λ³΄μž. 1κ³Ό 5κ³Ό κ΅μ°¨ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒ? λ‘˜ μ‚¬μ΄μ˜ κ±°λ¦¬λŠ” 일단 4λ‹€. 두 λ°˜μ§€λ¦„ (반경)의 합이 4λ₯Ό λ„˜μ–΄μ•Ό ν•œλ‹€. for 문을 λŒλ©΄μ„œ λ‘˜ μ‚¬μ΄μ˜ 차이와 λ°˜μ§€λ¦„μ˜ 합을 κ³„μ‚°ν•΄μ„œ ꡬ해보면 될까?

라고 ν–ˆμ§€λ§Œ νƒ€μž„μ•„μ›ƒ μ—λŸ¬κ°€ 났닀. for문을 μ΄μ€‘μœΌλ‘œ λŒμ•„μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— O(N^2)λ³΅μž‘λ„κ°€ λ‚˜μ˜¨λ‹€. breakκ°€ μ—†μ–΄μ„œ 빼도 박도 λͺ»ν•œλ‹€.

λ‘˜μ΄ κ²ΉμΉ˜λŠ”μ§€ μ•ˆκ²ΉμΉ˜λŠ”μ§€ 확인해볼 수 μžˆλŠ” 방법이 μžˆμ„κΉŒ? 각 κ·Έλ¦¬λŠ” μ›λ§ˆλ‹€ μ‹œμž‘μ κ³Ό 끝점을 [s, e] μ‹μœΌλ‘œ μ €μž₯ν•΄ λ‘μ—ˆλ‹€κ°€, 비ꡐ λŒ€μƒμ˜ 끝점과 μ‹œμž‘μ μ΄ κ²ΉμΉ˜λŠ”μ§€ 확인해보면 될 것이닀.

https://app.codility.com/demo/results/training86S6RE-49X/