- Published on
Codility - Number of Disc Intersections
- Author
- 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
μ΄ λ, κ΅μ°¨νλ λμ€ν¬μ μλ₯Ό ꡬνλΌ.
νμ΄
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]
μμΌλ‘ μ μ₯ν΄ λμλ€κ°, λΉκ΅ λμμ λμ κ³Ό μμμ μ΄ κ²ΉμΉλμ§ νμΈν΄λ³΄λ©΄ λ κ²μ΄λ€.