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/